原理概括:互相注册,相互守望
1、Eureka集群原理
- Eureka Server 之间通过 Replicate 进行数据同步
- 不同的 Eureka Server 之间不区分主从节点,所有节点都是平等的
- 节点之间,通过置顶 serviceUrl 来相互注册,形成一个集群,进而提高节点的可用性
- 在集群中,如果某个节点宕机,Eureka Client 会自动切换到新的 Eureka Server 上。
- 每个 Eureka Server 节点,都会互相同步数据
2、Eureka集群搭建
2.1、Eureka服务端集群搭建
2.1.1、服务端代码结构
Cloud-eureka-server7001和Cloud-eureka-server7002均为服务端
2.1.2、服务端POM文件
加入spring-cloud-starter-netflix-eureka-server
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>cloud</artifactId>
<groupId>com.uclass.springcloud</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>Cloud-eureka-server7002</artifactId>
<properties>
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
<dependency>
<groupId>com.uclass.springcloud</groupId>
<artifactId>Api-Commons</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!--热部署-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
</project>
2.1.3、 配置文件yaml
- 声明服务端实例名称
- 声明其他Eureka server-url,以形成集群
server:
port: 7002
eureka:
instance:
hostname: eureka7002.com #eureka服务端实例名称
client:
#false表示不向注册中心注册自己
register-with-eureka: false
#false表示自己就是注册中心,职责是维护服务实例,不需要检索服务
fetchRegistry: false
service-url:
#设置与Eureka Server交互的地址查询服务和注册服务的依赖地址
defaultZone: http://eureka7001.com:7001/eureka/
2.1.4、配置主启动类
加入 @EnableEurekaServer 注解,声明是Eureka服务端
@SpringBootApplication
//表名该服务是Eureka服务注册中心
@EnableEurekaServer
public class EurekaMain7002 {
public static void main(String[] args) {
SpringApplication.run(EurekaMain7002.class, args);
}
}
2.1.5、重复上述过程新建其他Eureka服务端
2.1.6、 测试
打开对应的服务端url,如下所示即为配置集群成功
此处url通过 C:\Windows\System32\drivers\etc\hosts文件 添加 127.0.0.1 eureka7001.com
2.2、Eureka 客户端-服务提供者集群搭建
2.2.1、创建多个微服务实例
2.2.2、在微服务实例中进行Eureka客户端配置
详情参考Eureka基础 Eureka基础_我的眼里只有学习的博客-CSDN博客
2.2.3、在单机客户端基础上,修改客户端yaml配置
添加多个 service-url:defaultZone
eureka:
client:
#表示将自己注册进EurekaServer默认为true
register-with-eureka: true
#是否从EurekaServer抓取已有的注册信息,默认为true,单节点无所谓,
#集群必须设置为true,才能配合ribbon使用负载均衡
fetchRegistry: true
service-url:
# defaultZone: http://localhost:7001/eureka #单机版
defaultZone: http://eureka7001.com:7001/eureka, http://eureka7002.com:7002/eureka #集群版
2.2.4、测试
- 访问 Eureka 服务端,显示多个已注册实例
- 此处创建了两个相同的服务生产者
2.3、Eureka 客户端-服务提供者集群搭建
服务消费者创建参考 Eureka基础_我的眼里只有学习的博客-CSDN博客
2.3.1、服务消费者 Controller 中访问url修改
在单机版基础上,首先修改服务提供者访问路径:http://服务提供者的微服务名称
@Slf4j
@RestController
public class OrderController {
//单机版可以写死,访问的url
// public static final String PAYMENT_URL = "http://localhost:8001";
//联机版,寻找Eureka暴露的微服务名称
public static final String PAYMENT_URL = "http://cloud-payment-service";
@Resource
private RestTemplate restTemplate;
//添加用户信息
@GetMapping("/consumer/payment/create")
public CommonResult<Payment> create(Payment payment) {
return restTemplate.postForObject(PAYMENT_URL + "/payment/create", payment, CommonResult.class);
}
//获取用户信息
@GetMapping("/consumer/payment/get/{id}")
public CommonResult<Payment> getPayment(@PathVariable("id") Long id) {
return restTemplate.getForObject(PAYMENT_URL + "/payment/get/" + id, CommonResult.class);
}
}
2.3.2、 yaml配置文件修改
添加多个Eureka服务端 url
server:
port: 80
eureka:
client:
#表示将自己注册进EurekaServer默认为true
register-with-eureka: true
#是否从EurekaServer抓取已有的注册信息,默认为true,单节点无所谓,
#集群必须设置为true,才能配合ribbon使用负载均衡
fetchRegistry: true
service-url:
defaultZone: http://eureka7001.com:7001/eureka, http://eureka7002.com:7002/eureka
spring:
application:
name: cloud-order-service #微服务名称
2.3.3、赋予restTemplate负载均衡机制
@Configuration
public class ApplicationContextConfig {
@Bean
@LoadBalanced //赋予restTemplate负载均衡机制
public RestTemplate getRestTemplate() {
return new RestTemplate();
}
}
如果不赋予restTemplate负载均衡机制,访问出错:
2.3.4、测试
3、微服务信息完善
3.1、规范化实例ID
3.1.1、修改yaml配置文件,添加微服务实例ID
instance:
# 主机名称的规范和修改
instance-id: payment8001
完整版:
eureka:
client:
#表示将自己注册进EurekaServer默认为true
register-with-eureka: true
#是否从EurekaServer抓取已有的注册信息,默认为true,单节点无所谓,
#集群必须设置为true,才能配合ribbon使用负载均衡
fetchRegistry: true
service-url:
# defaultZone: http://localhost:7001/eureka #单机版
defaultZone: http://eureka7001.com:7001/eureka, http://eureka7002.com:7002/eureka #集群版
instance:
# 主机名称的规范和修改
instance-id: payment8001
3.1.2、访问Eureka服务端查看修改结果
3.2、显示微服务IP地址
3.2.1、修改yaml配置文件,添加地址显示
# 访问路径可以显示IP
prefer-ip-address: true
完整版:
eureka:
client:
#表示将自己注册进EurekaServer默认为true
register-with-eureka: true
#是否从EurekaServer抓取已有的注册信息,默认为true,单节点无所谓,
#集群必须设置为true,才能配合ribbon使用负载均衡
fetchRegistry: true
service-url:
# defaultZone: http://localhost:7001/eureka #单机版
defaultZone: http://eureka7001.com:7001/eureka, http://eureka7002.com:7002/eureka #集群版
instance:
# 主机名称的规范和修改
instance-id: payment8001
# 访问路径可以显示IP
prefer-ip-address: true
3.2.2、访问Eureka服务端查看修改结果
4、服务发现
注册进Eureka的微服务,可以通过服务发现,获得该服务的信息、
4.1、DiscoveryClient 属性注入
@Resource
private DiscoveryClient discoveryClient;
4.2、调用 discoveryClient 中的方法获取微服务信息
@GetMapping(value = "/payment/discovery")
public Object discovery(){
List<String> services = discoveryClient.getServices();
for (String element:services){
log.info("****element:" + element);
}
//通过微服务名称获取微服务ID
List<ServiceInstance> instances = discoveryClient.getInstances("CLOUD-PAYMENT-SERVICE");
for (ServiceInstance instance:instances){
log.info(instance.getServiceId() + "\t" + instance.getHost()
+ "\t" + instance.getPort() + "\t" + instance.getUri());
}
return this.discoveryClient;
}
版权归原作者 我的眼里只有学习 所有, 如有侵权,请联系我们删除。