服务注册与发现eureka

前言

  微服务中,各个微服务动态变化,所以需要服务注册与发现功能。单个服务更加细粒度,多服务管理更加困难。服务注册与发现一般来说需要服务端和客户端两部分。

  spring cloud netflix eureka是spring cloud提供的服务发现和注册的基础组件之一,另外两个是consul和zookeeper。eureka是开箱即用的,屏蔽了server、client的交互细节。

基础:

  eureka是一个restful风格的服务发现与注册的基础服务组件。由server和client两部分组成,前者提供注册与发现功能,后者提供简化透明的与server交互的功能,完成服务的注册与发现。

********************************************************************************************

Eureka服务搭建

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 3     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
 4     <modelVersion>4.0.0</modelVersion>
 5     <parent>
 6         <groupId>org.springframework.boot</groupId>
 7         <artifactId>spring-boot-starter-parent</artifactId>
 8         <version>2.2.5.RELEASE</version>
 9         <relativePath/> <!-- lookup parent from repository -->
10     </parent>
11     <groupId>org.yang</groupId>
12     <artifactId>cloud</artifactId>
13     <version>0.0.1-SNAPSHOT</version>
14     <name>cloud</name>
15     <description>Demo project for Spring Boot</description>
16 
17     <properties>
18         <java.version>1.8</java.version>
19         <spring-cloud.version>Hoxton.SR3</spring-cloud.version>
20     </properties>
21 
22     <dependencies>
23         <dependency>
24             <groupId>org.springframework.boot</groupId>
25             <artifactId>spring-boot-starter-actuator</artifactId>
26         </dependency>
27         <dependency>
28             <groupId>org.springframework.boot</groupId>
29             <artifactId>spring-boot-starter-web</artifactId>
30             <exclusions>
31                 <exclusion>
32                     <groupId>org.springframework.boot</groupId>
33                     <artifactId>spring-boot-starter-tomcat</artifactId>
34                 </exclusion>
35             </exclusions>
36         </dependency>
37         <dependency>
38             <groupId>org.springframework.boot</groupId>
39             <artifactId>spring-boot-starter-jetty</artifactId>
40         </dependency>
41 
42         <dependency>
43             <groupId>org.springframework.cloud</groupId>
44             <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
45         </dependency>
46 
47         <dependency>
48             <groupId>org.springframework.boot</groupId>
49             <artifactId>spring-boot-starter-test</artifactId>
50             <scope>test</scope>
51             <exclusions>
52                 <exclusion>
53                     <groupId>org.junit.vintage</groupId>
54                     <artifactId>junit-vintage-engine</artifactId>
55                 </exclusion>
56             </exclusions>
57         </dependency>
58     </dependencies>
59 
60     <dependencyManagement>
61         <dependencies>
62             <dependency>
63                 <groupId>org.springframework.cloud</groupId>
64                 <artifactId>spring-cloud-dependencies</artifactId>
65                 <version>${spring-cloud.version}</version>
66                 <type>pom</type>
67                 <scope>import</scope>
68             </dependency>
69         </dependencies>
70     </dependencyManagement>
71 
72     <build>
73         <plugins>
74             <plugin>
75                 <groupId>org.springframework.boot</groupId>
76                 <artifactId>spring-boot-maven-plugin</artifactId>
77             </plugin>
78         </plugins>
79     </build>
80 </project>

更换了servlet容器,引入了cloud的监控工具actuator模块。

 1 server:
 2   port: 8083
 3 
 4 management: #默认http暴露health和info 且所有端点都在management下管理
 5   endpoints: #可通过endpoints.<method>.exposure.exclude/include单独配置需要暴露的端点
 6     web:
 7       exposure:
 8         include: info,health,beans #对外http仅暴露/info,/health,/beans三个端点
 9   endpoint:
10     health:
11       show-details: always #展示细节
12 eureka:
13   instance:
14     hostname: eureka1
15     instance-id: ${spring.application.name}:${spring.cloud.client.ip-address}:${server.port}
16   client:
17     register-with-eureka: true #向eureka服务器(下面的defaultZone)注册自己的信息
18     fetch-registry: true #向eureka服务器获取注册信息
19     service-url:
20       defaultZone: http://*。*。*。*:8084/eureka/ #eureka server注册中心的地址 *注意这里配置的是自己,一个eureka server同时也是一个client
21       #它也会尝试注册自己到server,所以需要至少一个注册中心的url来定位对等点peer,如果不提供这样一个注册点也可以,但是会在日志中打印无法向peer注册自己的信息,单机模式关闭同步和拉取即可
22 spring:
23   application:
24     name: eureka-server1 #service1服务类型
25 logging: 26  level: 27 org.springframework: INFO #SPRINGBOOT-DEBUG 可以选择debug模式方便查找问题

启动脚本: 

 1 #!/bin/sh
 2 
 3 eureka1=eureka1-1.0-SNAPSHOT.jar
 4 
 5 tpid=`ps -ef|grep -i $eureka1|grep -v 'grep'|grep -v 'kill'|awk '{print $2}'`
 6 
 7 if [ ${tpid} ] ; then
 8 echo 'stop eureka1'
 9 kill -15 $tpid
10 fi
11 
12 sleep 5
13 
14 tpid=`ps -ef|grep -i $eureka1|grep -v 'grep'|grep -v 'kill'|awk '{print $2}'`
15 
16 if [ ${tpid} ] ; then
17 echo 'kill eureka1'
18 kill -9 $tpid
19 else
20 echo 'kill success!'
21 fi
22 
23 tpid=`ps -ef|grep -i $eureka1|grep -v 'grep'|grep -v 'kill'|awk '{print $2}'`
24 
25 if [ ${tpid} ] ; then
26     echo 'App is running.'
27 else
28     echo 'App is NOT running.'
29 fi
30 
31 nohup java -jar $eureka1  >eureka1log.txt &
32 
33 echo $! > tpid
34 echo Start Success!

 ********************************************************************************************

 搭建基础

  Eureka Server:eureka server的自动配置需要注解@EnableEurekaServer,为项目自动配置必须的注册中心配置类,并将此服务标识位注册中心。

 Eureka Client:目前最新的eureka client,只要引入client依赖,此服务就会自动注册到配置文件中的defaultZone注册中心,不需要做任何操作,如果没有配置文件就使默认的;localhost:默认端口.

 配置负载均衡RestTemplate

@Bean
@LoadBalanced
public RestTemplate getRestTemplate(){
return new RestTemplate();
}

在服务调用者里调用远程服务,注意下面url中的eureka-service2,此为一个服务类型,resttemplate通过ribbon进行自动负载均衡从注册中心的eureka-service2服务中选择一个去发送此Http请求。

  RestTemplate是spring提供的同步HTTP网络客户端接口,强制使用RESTful风格,他会自己处理HTTP连接和关闭,只需要用户提供服务器地址和模板参数

  ribbon是一个管理Htpp和Tcp服务客户端的负载均衡器,通过指定不同的配置类,可以指定ribbon的负载均衡策略。

  RestTemplate和OpenFeign具有负载均衡的关键就是springCloud提供的两者与ribbon的无缝对接,两者都会被默认实现。

  @ribbonClient注解可以定制ribbon,name和configuration两个属性可以定制ribbon对象的名字和配置类。在配置类中会重建IPing和IRule两个组件,提供选择不同的IPing和IRule,ribbon会具有不同的功能性,即ribbon是可配置的。ribbon可以和eureka注册中心一起工作,获取服务列表信息,也可以提供listOfServers字段指定服务地址,可以在测试的时候使用。IRule是定义负载均衡策略的接口,它的子类代表了不同的负载均衡策略,提供6种,分为两类,一类是部根据服务器进行负载均衡的,另一类就是相反的。默认类zoneavoidancerule,根据服务器所属的服务区的整体运行状况来轮询选择,考虑服务器状态。还有roundRobinRule,此轮询不考虑服务器状态。

  另外ribbon可以提供自己完成网络请求。集成Netty,将网络请求的任务将给netty去做。

********************************************************************************************

 Eureka Client

  eureka client是eureka client与eureka server交互的关键,它将与eureka server的交互的细节隐藏起来,自主完成。它的流程如下:

1. 读取与eureka server交互的配置信息,封装成eurekaclientconfig。

2. 读取自身服务实例封装成eurekaInstanceConfig。

3. 此eureka server中拉取注册表信息并缓存到本地。

4. 服务注册。

5. 初始化执行发送心跳,缓存刷新,按需注册定时任务。

6. 定时发送心跳,拉取信息,按需注册。

7. 如需下线,则从eureka server中注销自身服务。

  springboot 通过EurekaDiscoveryClientConfiguration类完成对eureka client必要bean的属性读取和配置,包括eurekaClientConfig和EurekaInstanceConfig。另外还有DiscoveryClient客户端,这是spring中定义用服务发现的客户端接口。

  DiscoveryClient是springcloud的服务发现的顶级接口,eureka和consul中都有各自的实现。

  

 DiscoveryClient做的事情是:

  注册实例到eureka server;

  发送心跳更新与eureka server的租约;

  在服务关闭时,取消租约;

  查询在eureka server中注册的服务实例列表。

Eureka Server

  服务剔除:针对长时间不续约,不下线的服务,eureka server会将他们剔除,以保证服务的可靠性,但服务剔除方法evict有很多限制,以此来保证eureka server的高可用。

1. 自我保护期间不能进行服务剔除

2. 过期操作时分批进行的。

3. 服务剔除时随机逐个剔除,均匀分布在所有的应用中,防止程序崩溃。

  注册中心集群:

  eureka server 集群包括两个部分:一部分是eureka server在启动过程中会拉去peer节点的注册表信息。注册到自身注册表中 ;另一部分是自身每次对本地注册表进行操作时,同时会将操作同步到它的peer节点中。

  另外eureka server本身也是一个eureka client,所以它也会进行discoveryClient的初始化。

原文地址:https://www.cnblogs.com/YsirSun/p/12526638.html