服务注册中心
Eureka组件
一、Eureka概述
eureka作为Springcloud项目的服务注册与发现组件。
采用CS的设计模式,Eureka Server作为服务注册功能的服务器,是注册中心,系统中的其他微服务,作为Eureka的客户端(Eureka Client)连接到 Eureka Server 并维持心跳连接。
维护人员可以通过注册中心,查看系统中的各个微服务是否正常运行。
Eureka包含了两个组件:
-
Eureka Server:提供服务注册服务,各个节点启动后,会在Eureka Server中进行注册,这样EurekaServer中的服务注册表中将会存储所有可用服务节点的信息,服务节点的信息可以在界面中直观的看到。
-
Eureka Client:一个java客户端,用于简化与Eureka Server的交互,客户端同时也就是一个内置的、使用轮询(round-robin)负载算法的负载均衡器。
在应用启动后,将会向Eureka Server发送心跳,默认周期为30秒,如果Eureka Server在多个心跳周期内没有接收到某个节点的心跳,Eureka Server将会从服务注册表中把这个服务节点移除(默认90秒)。
二、单机版Eureka
-
1、创建Eureka注册中心模块
-
2、引入eureka server坐标依赖
<!-- 引入 eureka-server 依赖 --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> </dependency>
-
3、编写application.yml配置文件
server: port: 7001 eureka: instance: # eureka服务端的实例名称 hostname: localhost client: # false表示不向注册中心注册自己 register-with-eureka: false # false表示自己就是注册中心,职责是维护服务实例,并不需要去检索服务 fetch-registry: false service-url: # 与eureka服务交互的地址,查询服务和注册服务都是通过该地址进行 defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
-
4、主启动类添加@EnableEurekaServer注解
@SpringBootApplication @EnableEurekaServer public class EurekaMain7001 { public static void main(String[] args) { SpringApplication.run(EurekaMain7001.class,args); } }
-
5、启动项目,访问项目路径,能出现eureka页面,表示项目没问题。
三、微服务服务注册到Eureka Server
-
1、引入eureka client坐标依赖
<!--引入eureka client 依赖--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency>
-
2、application.yml文件中添加eureka配置
eureka: client: register-with-eureka: true fetch-registry: true service-url: # eureka注册中心地址 defaultZone: http://localhost:7001/eureka
-
3、主启动类添加@EnableEurekaClient注解
@SpringBootApplication @EnableEurekaClient public class PaymentMain8001 { public static void main(String[] args) { SpringApplication.run(PaymentMain8001.class,args); } }
-
先启动EurekaServer模块,再启动注册的模块,查看eureka页面中是否能检索到该微服务。
四、集群版Eureka
集群版为多个Eureka服务相互注册,避免由单一注册中心引发的单点故障。
-
1、搭建另一个端口为7002的Eureka单体版服务
-
2、修改hosts文件,实现端口映射
-
地址:C:\Windows\System32\drivers\etc
-
添加内容:
###### springcloud ###### 127.0.0.1 eureka7001.com 127.0.0.1 eureka7002.com
-
-
3、修改配置,改为集群配置。
-
hostname改为唯一名称
eureka: instance: # eureka服务端的实例名称 # hostname: localhost hostname: eureka7001.com
-
交互地址,改为其他eureka服务地址,多个用逗号分隔。
将该eureka服务注册到其他eureka注册中心中去。
eureka: client: service-url: # 与eureka服务交互的地址,查询服务和注册服务都是通过该地址进行 #defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/ defaultZone: http://eureka7002.com:7002/eureka/
-
-
4、其余客户端微服务,注册到eureka集群,通过修改配置文件。
eureka: client: register-with-eureka: true fetch-registry: true service-url: #defaultZone: http://localhost:7001/eureka # 配置eureka集群设置 defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka
五、Eureka注册服务信息补全
-
1、自定义微服务项目显示名称
eureka: instance: instance-id: payment8001
-
2、微服务项目连接显示ip地址
eureka: instance: prefer-ip-address: true #访问地址支持ip显示
六、服务发现Discovery
对于注册进Eureka里面的微服务,可以通过服务发现来获得该服务的信息
-
通过依赖注入的方式获取DiscoveryClient对象
import org.springframework.cloud.client.discovery.DiscoveryClient; @Resource private DiscoveryClient discoveryClient;
-
获取所有注册到eureka中的微服务名称
List<String> services = discoveryClient.getServices(); for (String service : services) { System.out.println("****service: " + service); }
-
根据微服务名称获取该服务下的项目或者集群的具体信息
List<ServiceInstance> instances = discoveryClient.getInstances("CLOUD-PAYMENT-SERVICE"); for (ServiceInstance instance : instances) { System.out.println(instance.getServiceId()+instance.getHost()+instance.getPort()+instance.getUri()); }
-
在主启动类上添加服务发现客户端注解:@EnableDiscoveryClient