3. 集群版Eureka
3.1 server端
server:
port: 7001
eureka:
client:
register-with-eureka: false
fetch-registry: false
service-url:
defaultZone: http://secondeureka:7002/eureka,http://thirdeureka:7003/eureka
server:
port: 7002
eureka:
client:
register-with-eureka: false
fetch-registry: false
service-url:
defaultZone: http://firsteureka:7001/eureka,http://thirdeureka:7003/eureka
server:
port: 7003
eureka:
client:
register-with-eureka: false
fetch-registry: false
service-url:
defaultZone: http://firsteureka:7001/eureka,http://secondeureka:7002/eureka
3.2 client端
- 每个client端注册在所有的注册中心
- 每个client可能存在多个实例
server:
port: 8001
spring:
application:
name: nike-consumer
eureka:
instance:
appname: nike-app-consumer
client:
register-with-eureka: true
fetch-registry: true
service-url:
defaultZone: http://127.0.0.1:7001/eureka,http://127.0.0.1:7002/eureka,http://127.0.0.1:7003/eureka
- DS Replicas: 将每个注册中心的defaultZone中的域名解析,作为注册中心的名字
![在这里插入图片描述](https://img-blog.csdnimg.cn/img_convert/8b3d7d7d858aa49274d86f4c82f6799e.png#pic_center)
4. 通过注册中心调用
- 对目标api,用服务名替换ip和port,并利用spring-cloud-loadbalancer实现负载均衡目的
1. 先启动服务注册中心
2. 微服务把自身通过 服务别名, 对应的ip和端口 会以k-v形式保存在注册中心
3. 服务调用时,通过 服务别名解析到具体的rpc的地址,进行服务调用
4. 消费者获得的服务地址, 缓存在本地jvm中,默认30s刷新一次
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;
@Configuration
public class RestTemplateConfig {
@Bean
@LoadBalanced
public RestTemplate getTemplate(){
return new RestTemplate();
}
}
@RestController
@RequestMapping("/consumer")
public class ConsumeController {
@Autowired
private RestTemplate restTemplate;
private final String url = "http://NIKE-PROVIDER/provider/name";
@GetMapping("/name")
public String getName() {
String result = restTemplate.getForObject(url, String.class);
return result + "==consumer";
}
}
5. actutor信息完善
- 一般通过点击status中的服务名,可以知道具体服务的ip和端口
- pom中必须添加actutor依赖
eureka:
instance:
instance-id: consumer8001
prefer-ip-address: true
![在这里插入图片描述](https://img-blog.csdnimg.cn/img_convert/09fd05a7008e155d5b70f19b558ee18d.png#pic_center)
6. 服务发现
@EnableDiscoveryClient
package com.nike.consumer;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
@RestController
@RequestMapping("/info")
public class ServiceController {
@Autowired
private DiscoveryClient discoveryClient;
@GetMapping("/service")
public void getService() {
List<String> services = discoveryClient.getServices();
System.out.println(services);
}
@GetMapping("/instance")
public void getInstance() {
String serviceName = "NIKE-PROVIDER";
List<ServiceInstance> instances = discoveryClient.getInstances(serviceName);
for (ServiceInstance instance: instances){
System.out.println(instance.getInstanceId() + instance.getHost() + instance.getPort() + instance.getUri());
}
}
}
7. 自我保护机制
7.1 机理
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210717110411491.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzM3NDU3OA==,size_16,color_FFFFFF,t_70#pic_center)
1. Client定期向Server端发送心跳包。但一定时间内,因为网络原因,
Server没有收到心跳包(假死),Server并不会立刻将该Client删除
2. Server节点在短时间内丢失过多Client时,该节点就会进入自我保护模式
3. 设计理念:宁可保留错误的服务信息,不会滥杀无辜
7.2 server端禁用
eureka:
client:
register-with-eureka: false
fetch-registry: false
service-url:
defaultZone: http://secondeureka:7002/eureka,http://thirdeureka:7003/eureka
server:
enable-self-preservation: false
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210717111411178.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzM3NDU3OA==,size_16,color_FFFFFF,t_70#pic_center)
8 停更