Springboot2.x整合SpringCloud之Eureka服务注册中心

Easter79
• 阅读 476

一、 什么是服务****注册中心

服务注册中心是服务实现服务化管理的核心组件,类似于目录服务的作用,主要用来存储服务信息,譬如提供者url串、路由信息等。服务注册中心是SOA架构中最基础的设施之一。

服务注册中心的作用

1,服务的注册

2,服务的发现

2. 常见的注册中心有哪些

1,Dubbo 的注册中心Zookeeper

2,Sringcloud的注册中心Eureka

3. 服务注册中心解决了什么问题

  1. 服务管理;
  2. 服务的依赖关系管理;

4. 什么是Eureka注册中心

Eureka是Netflix开发的服务发现组件,本身是一个基于REST的服务。Spring Cloud将它集成在其子项目spring-cloud-netflix中,以实现Spring Cloud的服务注册与发现,同时还提供了负载均衡、故障转移等能力。

5. Eureka注册中心三种角色

5.1 Eureka Server

通过Register、Get、Renew等接口提供服务的注册和发现。

5.2 Application Service (Service Provider)

服务提供方

把自身的服务实例注册到Eureka Server中

5.3 Application Client (Service Consumer)

服务调用方

通过Eureka Server 获取服务列表,消费服务。

二、 Eureka入门案例

1、创建项目

Springboot2.x整合SpringCloud之Eureka服务注册中心

 Springboot2.x整合SpringCloud之Eureka服务注册中心

2、pom.xml文件如下

 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.1.9.RELEASE</version>
 9         <relativePath/> <!-- lookup parent from repository -->
10     </parent>
11     <groupId>com.angei</groupId>
12     <artifactId>eurekaserver</artifactId>
13     <version>0.0.1-SNAPSHOT</version>
14     <name>eurekaserver</name>
15     <description>Demo project for Spring Boot</description>
16 
17     <properties>
18         <java.version>1.8</java.version>
19         <spring-cloud.version>Greenwich.SR3</spring-cloud.version>
20     </properties>
21 
22     <dependencies>
23         <dependency>
24             <groupId>org.springframework.cloud</groupId>
25             <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
26         </dependency>
27 
28         <dependency>
29             <groupId>org.springframework.boot</groupId>
30             <artifactId>spring-boot-starter-test</artifactId>
31             <scope>test</scope>
32         </dependency>
33     </dependencies>
34 
35     <dependencyManagement>
36         <dependencies>
37             <dependency>
38                 <groupId>org.springframework.cloud</groupId>
39                 <artifactId>spring-cloud-dependencies</artifactId>
40                 <version>${spring-cloud.version}</version>
41                 <type>pom</type>
42                 <scope>import</scope>
43             </dependency>
44         </dependencies>
45     </dependencyManagement>
46 
47     <build>
48         <plugins>
49             <plugin>
50                 <groupId>org.springframework.boot</groupId>
51                 <artifactId>spring-boot-maven-plugin</artifactId>
52             </plugin>
53         </plugins>
54     </build>
55 
56 </project>

提示:如果IDEA加载pom.xml时一直下载失败,可以在pom.xml中添加如下配置,使其从国内阿里云镜像中下载相关内容,下载速率将会大幅提升。

<repositories>
    <repository>
        <id>aliyun</id>    
        <name>aliyun</name>    
        <url>https://maven.aliyun.com/repository/public</url>    
    </repository>    
</repositories>

3、添加application.yml全局配置文件

 1 server:
 2   port: 8761
 3 eureka:
 4   instance:
 5     appname: provider-service
 6     hostname: localhost
 7   client:
 8     service-url:
 9       defaultZone:
10         http://localhost:8761/eureka/
11     register-with-eureka: false
12     fetch-registry: false

说明:

 1 server:
 2   port: 8761
 3 eureka:
 4   instance:
 5     #服务名,默认取 spring.application.name 配置值,如果没有则为 unknown
 6     appname: provider-service
 7     #设置当前实例的主机名称
 8     hostname: localhost
 9   client:
10     service-url: 
11       #指定服务注册中心地址,类型为 HashMap,并设置有一组默认值,
12       #默认的Key为 defaultZone;默认的Value为 http://localhost:8761/eureka ,
13       #如果服务注册中心为高可用集群时,多个注册中心地址以逗号分隔。
14       defaultZone:
15         http://localhost:8761/eureka/
16 
17     #是否将自己注册到Eureka-Server中,默认的为true
18     register-with-eureka: false
19 
20     #是否从Eureka-Server中获取服务注册信息,默认为true
21     fetch-registry: false

细节注意:

Springboot2.x整合SpringCloud之Eureka服务注册中心

附:**Spring Cloud Eureka 常用配置及说明**

4、修改启动类

 1 import org.springframework.boot.SpringApplication;
 2 import org.springframework.boot.autoconfigure.SpringBootApplication;
 3 import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
 4 
 5 @SpringBootApplication
 6 @EnableEurekaServer
 7 public class EurekaserverApplication {
 8 
 9     public static void main(String[] args) {
10         SpringApplication.run(EurekaserverApplication.class, args);
11     }
12 
13 }

5、通过浏览器访问Eureka-Server服务管理平台

Springboot2.x整合SpringCloud之Eureka服务注册中心

三、 搭建高可用Eureka注册中心(Eureka集群)

在微服务架构中,注册中心是一个必不可少的组件,前面我们搭建的注册中心只适合本地开发使用,在生产环境必须搭建一个集群来保证高可用。

Eureka的集群搭建很简单,每一台Eureka都需要在配置中指定另外N个Eureka的地址就可以。

在Eureka服务端的配置项eureka.client.serviceUrl.defaultZone中地址那一行要使用ip或域名,由于这里是在本地一台机子上模拟集群环境,ip地址都一样,所以通过更改本地host文件的方式创建三个可用的域名。

1.修改C:\Windows\System32\drivers\etc\hosts文件:

127.0.0.1 server1
127.0.0.1 server2
127.0.0.1 server3

2.本地刷新dns:

指令: ipconfig /flushdns

 Springboot2.x整合SpringCloud之Eureka服务注册中心

 Springboot2.x整合SpringCloud之Eureka服务注册中心

3.创建3个application.yml

注意:在集群环境下,每一个Eureka都需要将自己注册到Eureka-Server中(register-with-eureka默认就是true故可不配置)、也要从Eureka-Server中获取服务注册信息(fetch-registry默认就是true故可不配置)。

application-p8761.yml

server:
  port: 8761
eureka:
  instance:
    #服务名,默认取 spring.application.name 配置值,如果没有则为 unknown
    appname: provider-service
    #设置当前实例的主机名称
    hostname: server1
  client:
    service-url:
      #指定服务注册中心地址,类型为 HashMap,并设置有一组默认值,
      #默认的Key为 defaultZone;默认的Value为 http://localhost:8761/eureka ,
      #如果服务注册中心为高可用集群时,多个注册中心地址以逗号分隔,地址形式是ip或域名:端口号
      defaultZone:
        http://server2:8762/eureka/,http://server3:8763/eureka/

application-p8762.yml

server:
  port: 8762
eureka:
  instance:
    appname: provider-service
    hostname: server2
  client:
    service-url:
      defaultZone:
        http://server1:8761/eureka/,http://server3:8763/eureka/

application-p8763.yml

server:
  port: 8763
eureka:
  instance:
    appname: provider-service
    hostname: server3
  client:
    service-url:
      defaultZone:
        http://server1:8761/eureka/,http://server2:8762/eureka/

4.然后需要注意,application-xxxx.yml不是默认的配置形式,是无法被自动识别的,可以通过配置spring.profiles.active的方式指定运行时加载。

Springboot2.x整合SpringCloud之Eureka服务注册中心

5.分别启动pEurekaServerApplication-8761, EurekaServerApplication-8762, EurekaServerApplication-8763

Springboot2.x整合SpringCloud之Eureka服务注册中心

显示如下:

Springboot2.x整合SpringCloud之Eureka服务注册中心

6.同时,在客户端的配置项中设置服务注册中心地址时,设置为哪一个都可以,最好都写上(用逗号隔开),这样当其中一个节点挂了,客户端还会自动尝试连接其他节点。

server:
  port: 80
spring:
  application:
    name: order-service
eureka:
  client:
    service-url:
      #设置服务注册中心地址
      defaultZone:
        http://localhost:8761/eureka/,http://localhost:8762/eureka/,http://localhost:8763/eureka/

Springboot2.x整合SpringCloud之Eureka服务注册中心

四、 在Eureka注册中心中构建客户端服务

**Eureka客户端开发要点:
**   ①、maven 依赖 spring-cloud-starter-netflix-eureka-client;
   ②、application.yml 配置 eureka.client.service-url.defaultZone;
   ③、入口类増加 @EnableEurekaClient;

1、创建项目

Springboot2.x整合SpringCloud之Eureka服务注册中心

 Springboot2.x整合SpringCloud之Eureka服务注册中心

 Springboot2.x整合SpringCloud之Eureka服务注册中心

2、pom.xml文件如下

 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.1.9.RELEASE</version>
 9         <relativePath/> <!-- lookup parent from repository -->
10     </parent>
11     <groupId>com.angei</groupId>
12     <artifactId>eureka-client</artifactId>
13     <version>0.0.1-SNAPSHOT</version>
14     <name>eureka-client</name>
15     <description>Demo project for Spring Boot</description>
16 
17     <properties>
18         <java.version>1.8</java.version>
19         <spring-cloud.version>Greenwich.SR3</spring-cloud.version>
20     </properties>
21 
22     <dependencies>
23         <dependency>
24             <groupId>org.springframework.boot</groupId>
25             <artifactId>spring-boot-starter-web</artifactId>
26         </dependency>
27         <dependency>
28             <groupId>org.springframework.cloud</groupId>
29             <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
30         </dependency>
31 
32         <dependency>
33             <groupId>org.springframework.boot</groupId>
34             <artifactId>spring-boot-starter-test</artifactId>
35             <scope>test</scope>
36         </dependency>
37     </dependencies>
38 
39     <dependencyManagement>
40         <dependencies>
41             <dependency>
42                 <groupId>org.springframework.cloud</groupId>
43                 <artifactId>spring-cloud-dependencies</artifactId>
44                 <version>${spring-cloud.version}</version>
45                 <type>pom</type>
46                 <scope>import</scope>
47             </dependency>
48         </dependencies>
49     </dependencyManagement>
50 
51     <build>
52         <plugins>
53             <plugin>
54                 <groupId>org.springframework.boot</groupId>
55                 <artifactId>spring-boot-maven-plugin</artifactId>
56             </plugin>
57         </plugins>
58     </build>
59 
60 </project>

3、添加application.yml全局配置文件

 1 server:
 2   port: 80
 3 spring:
 4   application:
 5     name: order-service
 6 eureka:
 7   client:
 8     service-url:
 9       #设置服务注册中心地址
10       defaultZone:
11         http://localhost:8761/eureka/

4、修改启动类

 1 import org.springframework.boot.SpringApplication;
 2 import org.springframework.boot.autoconfigure.SpringBootApplication;
 3 import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
 4 
 5 @SpringBootApplication
 6 @EnableEurekaClient
 7 public class EurekaClientApplication {
 8     public static void main(String[] args) {
 9         SpringApplication.run(EurekaClientApplication.class, args);
10     }
11 }

5、测试

 1 package com.angei.eurekaclient.Controller;
 2 
 3 import org.springframework.stereotype.Controller;
 4 import org.springframework.web.bind.annotation.GetMapping;
 5 import org.springframework.web.bind.annotation.PathVariable;
 6 import org.springframework.web.bind.annotation.ResponseBody;
 7 
 8 @Controller
 9 public class orderController {
10 
11     @GetMapping("/order/{id}")
12     @ResponseBody
13     public String findById(@PathVariable("id") Integer orderId){
14         if(orderId==2019){
15             return "{\"Id\":1,\"Title\":\"饿了么订单\"}";
16         }else{
17             return null;
18         }
19     }
20 }

先启动服务器,再启动客户端:

Springboot2.x整合SpringCloud之Eureka服务注册中心

五、 在高可用的Eureka注册中心中模拟构建provider服务和consumer服务

(一)搭建provider提供服务

1.搭载环境

Springboot2.x整合SpringCloud之Eureka服务注册中心

 Springboot2.x整合SpringCloud之Eureka服务注册中心

 Springboot2.x整合SpringCloud之Eureka服务注册中心

配置application.properties,将服务注册到注册中心。

spring.application.name=eureka-provider
server.port=9090
#设置服务注册中心地址
eureka.client.serviceUrl.defaultZone=http://server1:8761/eureka/,http://server2:8762/eureka/,http://server3:8763/eureka/

2.模拟提供服务

创建User实体类:

 1 import lombok.Getter;
 2 import lombok.Setter;
 3 import java.io.Serializable;
 4 
 5 @Getter
 6 @Setter
 7 public class User implements Serializable {
 8 
 9     private int id;
10 
11     private String name;
12 
13     public User() {
14     }
15 
16     public User(int id, String name) {
17         this.id = id;
18         this.name = name;
19     }
20 
21     @Override
22     public String toString() {
23         return "学号:" + this.id + "\t姓名:" + this.name;
24     }
25 }

创建userController:

 1 import com.example.demo.pojo.User;
 2 import org.springframework.stereotype.Controller;
 3 import org.springframework.web.bind.annotation.RequestMapping;
 4 import org.springframework.web.bind.annotation.RestController;
 5 
 6 import java.util.ArrayList;
 7 
 8 @Controller
 9 @RestController
10 public class userController {
11 
12     @RequestMapping("/getAllUser")
13     public ArrayList<User> getAllUser() {
14         ArrayList<User> list = new ArrayList<>();
15         list.add(new User(2018, "Benjieming"));
16         list.add(new User(2019, "Huangsi"));
17         list.add(new User(2020, "Yangyi"));
18         return list;
19 
20     }
21 }

3.启动项目并检测

Springboot2.x整合SpringCloud之Eureka服务注册中心

(二)  搭建consumer调用服务

1.创建项目,过程同provider,最终项目结构如下:

Springboot2.x整合SpringCloud之Eureka服务注册中心

application.yml内容如下:

server:
  port: 9091
spring:
  application:
    name: eureka-consumer
eureka:
  client:
    service-url:
      #设置服务注册中心地址
      defaultZone:
        http://server1:8761/eureka/,http://server2:8762/eureka/,http://server3:8763/eureka/

2.创建userService和userController

userService.java

 1 package com.angei.eurekaclient.Service;
 2 
 3 import com.angei.eurekaclient.pojo.User;
 4 import org.springframework.beans.factory.annotation.Autowired;
 5 import org.springframework.cloud.client.ServiceInstance;
 6 import org.springframework.cloud.client.loadbalancer.LoadBalancerClient;
 7 import org.springframework.core.ParameterizedTypeReference;
 8 import org.springframework.http.HttpMethod;
 9 import org.springframework.http.ResponseEntity;
10 import org.springframework.stereotype.Service;
11 import org.springframework.web.client.RestTemplate;
12 
13 import java.util.List;
14 
15 @Service
16 public class userService {
17 
18     @Autowired
19     private LoadBalancerClient loadBalancerClient;//ribbon负载均衡器
20 
21     public List<User> getUsers() {
22 
23         //选择调用的服务的名称
24         //ServiceInstance类封装了服务的基本信息,如 IP,端口等
25         ServiceInstance si = this.loadBalancerClient.choose("eureka-provider");
26         //拼接访问服务的URL
27         StringBuffer sb = new StringBuffer();
28         //http://server1:8761/getAllUser
29         System.out.println("host:" + si.getHost());
30         System.out.println("Port:" + si.getPort());
31         sb.append("http://").append(si.getHost()).append(":").append(si.getPort()).append("/getAllUser");
32 
33 
34         //springMVC RestTemplate
35         RestTemplate rt = new RestTemplate();
36 
37         ParameterizedTypeReference<List<User>> type = new ParameterizedTypeReference<List<User>>() {
38         };
39 
40         //ResponseEntity:封装了返回值信息
41         ResponseEntity<List<User>> response = rt.exchange(sb.toString(), HttpMethod.GET, null, type);
42         List<User> list = response.getBody();
43         return list;
44     }
45 }

注意:这里是向注册中心获取服务并拉取信息。

userController.java

 1 package com.angei.eurekaclient.Controller;
 2 
 3 import com.angei.eurekaclient.Service.userService;
 4 import com.angei.eurekaclient.pojo.User;
 5 import org.springframework.web.bind.annotation.RequestMapping;
 6 import org.springframework.web.bind.annotation.RestController;
 7 
 8 import javax.annotation.Resource;
 9 import java.util.List;
10 
11 @RestController
12 public class userController {
13 
14     @Resource
15     private userService userservice;
16 
17     @RequestMapping("/getAllUsers")
18     public List<User> getUsers(){
19         return userservice.getUsers();
20     }
21 }

3.启动项目并测试

Springboot2.x整合SpringCloud之Eureka服务注册中心

 Springboot2.x整合SpringCloud之Eureka服务注册中心

五、 Eureka注册中心架构原理

1、Eureka架构图

Springboot2.x整合SpringCloud之Eureka服务注册中心

说明:

**Register(服务注册)**:把自己的IP和端口注册给Eureka。

**Renew(服务续约)**:发送心跳包,每30秒发送一次。告诉Eureka自己还活着。

**Cancel(服务下线)**:当provider关闭时会向Eureka发送消息,把自己从服务列表中删除。防止consumer调用到不存在的服务。

**Get Registry(获取服务注册列表)**:获取其他服务列表。

**Replicate(集群中数据同步)**:eureka集群中的数据复制与同步。

**Make Remote Call(远程调用)**:完成服务的远程调用。

2、CAP原则

CAP原则又称CAP定理,指的是在一个分布式系统中,Consistency(一致性)、 Availability(可用性)、Partition tolerance(分区容错性),三者不可兼得。

CAP由Eric Brewer在2000年PODC会议上提出。该猜想在提出两年后被证明成立,成为我们熟知的CAP定理。

Springboot2.x整合SpringCloud之Eureka服务注册中心

 Springboot2.x整合SpringCloud之Eureka服务注册中心

3、基于分布式CAP定理,分析注册中心两大主流框架:分析Eureka与Zookeeper的区别

 Springboot2.x整合SpringCloud之Eureka服务注册中心

六、 Eureka优雅停服

1、在什么条件下,Eureka会启动自我保护?

什么是自我保护模式

1,自我保护的条件
一般情况下,微服务在Eureka上注册后,会每30秒发送心跳包,Eureka通过心跳来判断服务是否健康,同时会定期删除超过90秒没有发送心跳服务。
2,有两种情况会导致Eureka Server收不到微服务的心跳
a.是微服务自身的原因;
b.是微服务与Eureka之间的网络故障;
通常微服务的自身的故障关闭只会导致个别服务出现故障,一般不会出现大面积故障,而网络故障通常会导致Eureka Server在短时间内无法收到大批心跳。
考虑到这个区别,Eureka设置了一个阀值,当判断挂掉的服务的数量超过阀值时,Eureka Server认为很大程度上出现了网络故障,将不再删除心跳过期的服务。
3,那么这个阀值是多少呢?
15分钟之内故障率是否低于85%;
Eureka Server在运行期间,会统计心跳失败的比例在15分钟内是否低于85%,
这种算法叫做Eureka Server的自我保护模式。

2、为什么要启动自我保护?

为什么要自我保护

1,因为同时保留"好数据"与"坏数据"总比丢掉任何数据要更好,当网络故障恢复后,这个Eureka节点会退出"自我保护模式"。
2,Eureka还有客户端缓存功能(也就是微服务的缓存功能)。即便Eureka集群中所有节点都宕机失效,微服务的Provider和Consumer都能正常通信。
3,微服务的负载均衡策略会自动剔除死亡的微服务节点。

3、如何关闭自我保护?

修改Eureka Server配置文件

#关闭自我保护:true为开启自我保护,false为关闭自我保护
eureka.server.enableSelfPreservation=false
#清理间隔(单位:毫秒,默认是60*1000)
eureka.server.eviction.interval-timer-in-ms=60000

4、如何优雅停服?(springboot - version: 2.1.0.RELEASE及以上)

第1步:不需要在Eureka Server中再配置关闭自我保护的相关配置。

#如果在刚刚的演示中添加了如下配置,则全部删去。
#关闭自我保护:true为开启自我保护,false为关闭自我保护
eureka.server.enableSelfPreservation=false
#清理间隔(单位:毫秒,默认是60*1000)
eureka.server.eviction.interval-timer-in-ms=60000

第2步:在服务中添加actuator.jar依赖包。

<!-- springboot监控 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

第3步:修改配置文件,添加如下内容:

1 management:
2   endpoint:
3     shutdown:
4       enabled: true
5   endpoints:
6     web:
7       exposure:
8         include: "*"

management.endpoint.shutdown.enabled 这是说是否启动/shutdown端点,默认是false,
management.endpoints.web.exposure.include 这是说公开所有端点。

第4步:发送一个关闭服务的URL请求。注意:请求方式必须是post请求。

请求格式:http://待关闭微服务ip:端口号/actuator/shutdown

如:http://127.0.0.1:9090/actuator/shutdown

(1)方式一:以下是通过一个HttpClientUtil工具类来发送一个post请求。

  1 public class HttpClientUtil {
  2 
  3     public static String doGet(String url, Map<String, String> param) {
  4 
  5         // 创建Httpclient对象
  6         CloseableHttpClient httpclient = HttpClients.createDefault();
  7 
  8         String resultString = "";
  9         CloseableHttpResponse response = null;
 10         try {
 11             // 创建uri
 12             URIBuilder builder = new URIBuilder(url);
 13             if (param != null) {
 14                 for (String key : param.keySet()) {
 15                     builder.addParameter(key, param.get(key));
 16                 }
 17             }
 18             URI uri = builder.build();
 19 
 20             // 创建http GET请求
 21             HttpGet httpGet = new HttpGet(uri);
 22 
 23             // 执行请求
 24             response = httpclient.execute(httpGet);
 25             // 判断返回状态是否为200
 26             if (response.getStatusLine().getStatusCode() == 200) {
 27                 resultString = EntityUtils.toString(response.getEntity(), "UTF-8");
 28             }
 29         } catch (Exception e) {
 30             e.printStackTrace();
 31         } finally {
 32             try {
 33                 if (response != null) {
 34                     response.close();
 35                 }
 36                 httpclient.close();
 37             } catch (IOException e) {
 38                 e.printStackTrace();
 39             }
 40         }
 41         return resultString;
 42     }
 43 
 44     public static String doGet(String url) {
 45         return doGet(url, null);
 46     }
 47 
 48     public static String doPost(String url, Map<String, String> param) {
 49         // 创建Httpclient对象
 50         CloseableHttpClient httpClient = HttpClients.createDefault();
 51         CloseableHttpResponse response = null;
 52         String resultString = "";
 53         try {
 54             // 创建Http Post请求
 55             HttpPost httpPost = new HttpPost(url);
 56             // 创建参数列表
 57             if (param != null) {
 58                 List<NameValuePair> paramList = new ArrayList<>();
 59                 for (String key : param.keySet()) {
 60                     paramList.add(new BasicNameValuePair(key, param.get(key)));
 61                 }
 62                 // 模拟表单
 63                 UrlEncodedFormEntity entity = new UrlEncodedFormEntity(paramList,"utf-8");
 64                 httpPost.setEntity(entity);
 65             }
 66             // 执行http请求
 67             response = httpClient.execute(httpPost);
 68             resultString = EntityUtils.toString(response.getEntity(), "utf-8");
 69         } catch (Exception e) {
 70             e.printStackTrace();
 71         } finally {
 72             try {
 73                 response.close();
 74             } catch (IOException e) {
 75                 // TODO Auto-generated catch block
 76                 e.printStackTrace();
 77             }
 78         }
 79 
 80         return resultString;
 81     }
 82 
 83     public static String doPost(String url) {
 84         return doPost(url, null);
 85     }
 86     
 87     public static String doPostJson(String url, String json) {
 88         // 创建Httpclient对象
 89         CloseableHttpClient httpClient = HttpClients.createDefault();
 90         CloseableHttpResponse response = null;
 91         String resultString = "";
 92         try {
 93             // 创建Http Post请求
 94             HttpPost httpPost = new HttpPost(url);
 95             // 创建请求内容
 96             StringEntity entity = new StringEntity(json, ContentType.APPLICATION_JSON);
 97             httpPost.setEntity(entity);
 98             // 执行http请求
 99             response = httpClient.execute(httpPost);
100             resultString = EntityUtils.toString(response.getEntity(), "utf-8");
101         } catch (Exception e) {
102             e.printStackTrace();
103         } finally {
104             try {
105                 response.close();
106             } catch (IOException e) {
108                 e.printStackTrace();
109             }
110         }
111 
112         return resultString;
113     }
114     
115     public static void main(String[] args) {
116         String url ="http://127.0.0.1:9090/actuator/shutdown";
117         //该url必须要使用doPost方式来发送
118         HttpClientUtil.doPost(url);
119     }
120 }

(2)方式二:通过postman软件发送shutdown命令。

  Springboot2.x整合SpringCloud之Eureka服务注册中心

七、 如何加强Eureka注册的安全认证

1、在Eureka Server中添加security的依赖包

<dependencies>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
    </dependency>

    <!--设置登录密码需要用到Spring Security,导入security的依赖包-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-security</artifactId>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
</dependencies>

2、修改Eureka的Server配置文件 application.yml

#设置eurekaServer的登录密码
spring:
  security:
    user:
      name: admin  # 用户名
      password: admin   # 用户密码

注意:如果是在集群环境下,例如上面示例中的集群环境,则需要分别在applicaion-p8761.properties、applicaion-p8762.properties、applicaion-p8763.properties都进行eurekaServer的登录密码设置。

3、修改Eureka集群节点之间互相访问的url值

eureka.client.serviceUrl.defaultZone=http://admin:admin@server2:8762/eureka/, http://admin:admin@server3:8763/eureka/

4、关闭注册中心Spring Security的CSRF验证

如果不关闭,那么客户端就连接不上。

 1 import org.springframework.context.annotation.Configuration;
 2 import org.springframework.security.config.annotation.web.builders.HttpSecurity;
 3 import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
 4 import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
 5 
 6 /**
 7  如果eurekaServer设置了登录密码,就必须关闭Spring Security的CSRF验证
 8  */
 9 @EnableWebSecurity
10 @Configuration //@Configuration标注在类上,相当于把该类作为spring的xml配置文件中的<beans>,作用为:配置spring容器(应用上下文)。
11 public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
12 
13     @Override
14     protected void configure(HttpSecurity http) throws Exception {
15         http.csrf().disable(); //关闭csrf
16         super.configure(http);
17     }
18 }

5、修改微服务的配置文件添加访问注册中心的用户名与密码

配置Client的application.properties:

spring.application.name=eureka-provider
server.port=9090

#设置服务注册中心地址,指向另一个注册中心
eureka.client.serviceUrl.defaultZone=http://admin:admin@server1:8761/eureka/, http://admin:admin@server2:8762/eureka/, http://admin:admin@server3:8763/eureka/

#启用shutdown
endpoints.shutdown.enabled=true
#禁用密码验证
endpoints.shutdown.sensitive=false

演示效果: 

   Springboot2.x整合SpringCloud之Eureka服务注册中心

  Springboot2.x整合SpringCloud之Eureka服务注册中心

点赞
收藏
评论区
推荐文章
Wesley13 Wesley13
2年前
Spring Cloud Eureka源代码解析(1)Eureka启动,原生启动与SpringCloudEureka启动异同
Eureka作为服务注册中心对整个微服务架构起着最核心的整合作用,因此对Eureka还是有很大的必要进行深入研究。Eureka1.x版本是纯基于servlet的应用。为了与springcloud结合使用,除了本身eureka代码,还有个粘合模块springcloudnetflixeurekaserver。在我们启动EurekaServer实例
捉虫大师 捉虫大师
3年前
dubbo应用级服务发现初体验
dubbo应用级服务发现介绍了解dubbo的朋友知道,dubbo的provider启动时向注册中心注册,consumer从注册中心消费。目前dubbo往注册中心上注册的数据是接口级,而应用级服务发现是往注册中心上注册实例(ipport),两者的区别只是注册的粒度不同。至于为什么会出现应用级服务发现,有如下几点原因与业界主流微服务模型对齐,比如Sprin
Easter79 Easter79
2年前
springcloud中微服务的优雅停机(已验证)
 大部分项目部署中,为了方便,可能都直接使用kill9服务的pid来停掉服务。但是由于Eureka采用心跳的机制来上下线服务,会导致服务消费者调用此已经kill的服务提供者然后出错。可以采用以下方式来解决:核心是先调用方法主动通知Eureka注册中心服务下线,然后再停掉服务。本文会介绍几种eureka注册中心服务下线的方式最不可取
Easter79 Easter79
2年前
SpringCloud注册中心高可用搭建
SpringCloud的注册中心可以由Eureka、Consul、Zookeeper、ETCD等来实现,这里推荐使用SpringCloudEureka来实现注册中心,它基于Netfilix的Eureka做了二次封装,完成分布式服务中服务治理的功能,微服务系统中的服务注册与发现都通过这个注册中心来进行管理。引入EurekaServer依赖
Stella981 Stella981
2年前
Spring Cloud系列教程(六):服务注册与发现Consul(Finchley版本)
一、前言在微服务领域,服务注册与发现是其中很重要的一个模块,主要用于服务治理问题;在分布式Dubbo中常用的服务发现与注册中心是Zookeeper,Cosul与其类似,在SpringCloud刚占领市场的时候,SpringCloud微服务框架默认使用的注册中心组建是Eureka,总所周知,Eureka已经开始闭源了,
Easter79 Easter79
2年前
SpringCloud常用组件
springcloud中有五大核心组件Eureka、Ribbon、Feign、Hystrix、Zuul,简单记录如下。Eureka是微服务架构中的注册中心,专门负责服务的注册与发现。EurekaClient组件专门负责将服务的信息注册到EurekaServer中,而EurekaServer是一个注册中心,里面有一个注册表,保存了各服务所在
Easter79 Easter79
2年前
SpringCloud学习(3)——Eureka服务注册中心及服务发现
Eureka概述Eureka是Netflix的一个子模块,也是核心模块之一。Eureka是一个基于REST的服务,用于定位服务,以实现云端中间层服务发现和故障转移。服务注册与发现对于微服务框架来说非常重要,有了服务注册和发现,只需要使用服务的标识符,就可以访问到服务,而不需要修改服务调用的配置文件了。功能类似于
Stella981 Stella981
2年前
Golang注册Eureka的工具包goeureka发布
1.简介提供Go微服务客户端注册到Eureka中心。点击:github地址(https://www.oschina.net/action/GoToLink?urlhttps%3A%2F%2Fgithub.com%2FSimonWang00%2Fgoeureka),欢迎各位多多star!(已通过测试验证,用于正式生产部署)2.原理
Easter79 Easter79
2年前
SpringCloud Eureka服务治理机制
一、基础架构!(https://oscimg.oschina.net/oscnet/c088a917c16ee8be06202e47bd73e50a7a0.png)构建Eureka服务治理有三个核心角色:服务注册中心、服务提供者和服务消费者。上图就是这三个角色之间的通信工作架构图。服务注册中心(Eureka 
Stella981 Stella981
2年前
Spring Cloud Eureka的基础架构
基础架构服务注册中心:Eureka提供的服务端,提供服务注册于发现的功能,也就是在上一节中我们实现的eurekaserver服务提供者:提供服务的应用,可以是springBoot应用,也可以是其他技术平台且遵循Eureka通信机制的应用。它将自己提供的服务注册到Eureka,以供其他应用发现,也
Easter79
Easter79
Lv1
今生可爱与温柔,每一样都不能少。
文章
2.8k
粉丝
5
获赞
1.2k