服务治理组件Spring Cloud Eureka是微服务架构最基础的模块。为什么要有服务治理组件?在服务数量较少时,我们可以通过静态配置来完成服务间的相互调用。随着系统越来越复杂,服务数量越来越多,且可能数量在不断频繁变化,手工维护的静态配置将越来越难,需要一个组件来完成自动化的服务注册与发现功能。Eureka由Eureka Server与Eureka Client两个组件组成。
首先,在IDEA中通过Spring Initializr选择Spring Cloud Discovery 中的Eureka Server组件(将自动在pom.xml添加Eureka Server相关的依赖),创建一个Spring Boot项目添加pom依赖(之后项目都要添加)
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> 直接运行该程序,启动后在浏览器访问localhost:1111,结果如图所示 在原程序上只添加一个Eureka Server的注解,运行程序访问localhost:1111结果如图 @SpringBootApplication @EnableEurekaServer public class EurekaApplication { public static void main(String[] args) { SpringApplication.run(EurekaApplication.class, args); } } 在application.yml中修改相应的配置 server: port: 1111 eureka: client: fetch-registry: false register-with-eureka: false service-url: defaultZone: http://localhost:1111/eureka/ server: enable-self-preservation: false spring: application: name: eurekaserver.port 用来指定该服务运行时所占用的端口号(内置Tomcat容器运行时的端口号)
eureka.client.register-with-eureka 用来指定注册中心是否注册自己的微务
神坑:server.port与eureka.client.register-with-eureka端口号一定要相同,否则自身是无法注册在注册中心的,其他client也无法注册
eureka.client.fetch-registry 用来指定是否需要检索服务,即服务发现
eureka.client.service-url 用来指定注册中心的地址,其他服务注册时要注册在这个地址上
eureka.server.enable-self-preservation 用来指定注册中心的健康检查机制,开发状态下默认是宁可信其有不可信其无的模式,与生产环境保持一致则设为false
spring.application.name 用来指定该服务的名称
同server,在IDEA中通过Spring Initializr选择Spring Cloud Discovery 中的Eureka Discovery Client 组件,创建一个Spring Boot项目
在原程序上添加一个@EnableEurekaClient的注解@EnableDiscoveryClient与@EnableEurekaClient区别: 如果选用的注册中心是eureka,那么就推荐@EnableEurekaClient, 如果选用其他的注册中心,那么推荐使用@EnableDiscoveryClient, 源码中@EnableEurekaClient注解包含@EnableDiscoveryClient注解。
在application.yml中修改相应的配置 eureka: client: service-url: defaultZone: http://localhost:1111/eureka/ instance: hostname: ClientName spring: application: name: clienteureka.instance.hostname 用来指定该服务实例后来访问时的域名,即替代下图红框中的内容
在已启动注册中心的情况下,运行Client 程序,然后访问localhost:1111结果如图可见client端已注册在注册中心上
为什么要Eureka高可用? 所有的服务都注册在注册中心上,若注册中心宕机,整个微服务框架将不可用,那么此时服务拆分与单体架构并无区别,不能达到高可用的目的。
在原有项目的基础上,注释掉server.port=1111的配置,在启动配置中复制一份服务,并在启动配置中配置server.port
EurekaApplication1服务运行端口为1112,注册在EurekaApplication2的地址http://localhost:1111/eureka/上;
EurekaApplication2服务运行端口为1111,注册在EurekaApplication1的地址http://localhost:1112/eureka/上;
Eureka Client 服务不变(注册在EurekaApplication1上),此时运行两个Eureka server服务,访问localhost:1111即EurekaApplication2服务,发现Eureka Client 服务也注册在了EurekaApplication2上。
若此时EurekaApplication1宕机,client 仍注册在EurekaApplication2上,保障了Eureka Server的高可用;但如若此时又将client 重启,将无法注册在EurekaApplication2上,所以应该将client 在EurekaApplication1、EurekaApplication2都要注册,即defaultZone= http://localhost:1111/eureka/, http://localhost:1112/eureka/。逻辑图如下:
4. 3个Eureka Server的高可用逻辑图如图
客户端发现
Eureka Client就是这种方式,Client(A) 在 Eureka Server上获取要消费的多个服务实例(B1、B2、B3…)并缓存在本地,通过负载均衡算法(轮询、随机、哈希等)选择一个实例去消费。该方式简单直接,但需要每个Client实现一套选择机制。Spring Cloud全系列实现方式。
服务端发现(代理)
Eureka Server与要消费的多个服务实例(B1、B2、B3…)对Client(A)透明不可见,A只需访问代理,由代理选择一个B供消费。Ngnix、Zookeeper、K8S都可以作为服务发现的负载均衡器。阿里系实现方式。
Ngnix不仅可以作为HTTP反向代理服务器也可以做服务发现的负载均衡器
相同语言(Java)
Eureka Server与Eureka Client 均是由Java实现的。Spring Cloud全系列框架主要适于Java实现的分布式系统,或者与JVM兼容的语言构建的系统。如若其他语言想应用Eureka,需自己实现客户端,如.NET的Steeltoe、Node.js的eureka-js-client。服务间调用方式为Restful。
不同语言
不同语言是微服务的特点之一即异构(不同语言、不同数据库),此时最好使用阿里系的dubbo,效率会更高。服务间调用方式为RPC。