一、 什么是服务****注册中心
服务注册中心是服务实现服务化管理的核心组件,类似于目录服务的作用,主要用来存储服务信息,譬如提供者url串、路由信息等。服务注册中心是SOA架构中最基础的设施之一。
1 服务注册中心的作用
1,服务的注册
2,服务的发现
2. 常见的注册中心有哪些
1,Dubbo 的注册中心Zookeeper
2,Sringcloud的注册中心Eureka
3. 服务注册中心解决了什么问题
- 服务管理;
- 服务的依赖关系管理;
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、创建项目
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
细节注意:
附:**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服务管理平台
三、 搭建高可用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
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的方式指定运行时加载。
5.分别启动pEurekaServerApplication-8761, EurekaServerApplication-8762, EurekaServerApplication-8763
显示如下:
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/
四、 在Eureka注册中心中构建客户端服务
**Eureka客户端开发要点:
** ①、maven 依赖 spring-cloud-starter-netflix-eureka-client;
②、application.yml 配置 eureka.client.service-url.defaultZone;
③、入口类増加 @EnableEurekaClient;
1、创建项目
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 }
先启动服务器,再启动客户端:
五、 在高可用的Eureka注册中心中模拟构建provider服务和consumer服务
(一)搭建provider提供服务
1.搭载环境
配置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.启动项目并检测
(二) 搭建consumer调用服务
1.创建项目,过程同provider,最终项目结构如下:
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.启动项目并测试
五、 Eureka注册中心架构原理
1、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定理。
3、基于分布式CAP定理,分析注册中心两大主流框架:分析Eureka与Zookeeper的区别
六、 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命令。
七、 如何加强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
演示效果: