Spring Cloud 学习笔记(2) 服务治理 Eureka
1. 背景
我们开始学习 Eureka。
2. 知识
Eureka 是 Spring Cloud Netflix 微服务套件中的一部分。Netflix Eureka来实现服务注册与发现, 它包含了服务端和客户端组件。
服务注册:在服务治理框架中, 通常都会构建一个注册中心, 每个服务单元向注册中心登记自己提供的服务, 将主机与端口号、 版本号、 通信协议等一些附加信息告知注册中心, 注册中心按服务名分类组织服务清单。
服务发现: 由于服务间的调用不再通过具体地址来实现, 而是通过向服务名发起请求调用实现。调用方需要向服务注册中心咨询服务, 并 获取所有服务的实例清单, 以实现对具体服务实例的访问。
- Eureka服务端,我们也称为服务注册中心
- Eureka客户端,主要处理服务的注册与发现
3. 示例
示例是这样的。
- 1、搭建服务注册中心
- 2、搭建一个服务提供者,注册到上面的“注册中心”
- 3、搭建一个服务使用者,调用 “服务提供者” 提供的 服务
1) 搭建服务注册中心
服务注册中心会维护一个“服务清单”,它记录了主机与端口号、 版本号、 通信协议等一些附加信息等。启动后的服务注册中心将等待 “服务提供者” 来注册。
先创建项目,按下图。
image.png修改配置文件 application.properties
server.port=1111
eureka.instance.hostname=localhost
# 由于该应用为注册中心,所以设置 为 false, 代表不向注册中心注册自己。
eureka.client.register-with-eureka=false
# 由于注册中心的职责就是维护服务实例,它并不需要去检索服务, 所以也设置为 false
eureka.client.fetch-registry=false
eureka.client.serviceUrl.defaultZone=http://${eureka.instance.hostname}:${server.port}/eureka/
2) 搭建一个服务提供者
我们演示创建一个简单的微服务,访问 /hello 返回字符串。它将注册到上面搭建的 注册中心。
先创建项目
image.png这是,再次看出 eureka,可以看到已经注册成功
image.png在完成了服务注册中心的搭建之后,接下将一个Spring Boot 应用加 入 Emeka 的服务治理体系中去。
3.搭建高可用注册中心
在微服务架构这样的分布式环境中, 我们需要充分考虑发生故障的情况, 所以在生产 环境中必须对各个组件进行高可用部署。
EurekaServer的高可用实际上就是将自己作为服务向其他服务注册中心注册自己, 这 样就可以形成一组互相注册的服务注册中心, 以实现服务清单的互相同步, 达到高可用的 效果。
示例
我们将搭建 peer1 和 peer2 两个 Eureka,互相注册。一旦注册完毕后,它们之间将会互相同步。
步骤1,第一个 Eureka 服务:peer1 的配置
修改配置文件 application.properties
server.port=1111
spring.application.name=peerl1
eureka.client.serviceUrl.defaultZone=http://peer2:1112/eureka/
步骤2,第二个 Eureka 服务:peer2 的配置
修改配置文件 application.properties
server.port=1112
spring.application.name=peerl2
eureka.client.serviceUrl.defaultZone=http://peer1:1111/eureka/
步骤3,修改hosts 以看到效果
127.0.0.1 peer1
127.0.0.1 peer2
步骤4,访问
访问 http://localhost:1111/ 和,http://localhost:1112 都可以看到:
4.使用 ribbon 客户端负载均衡访问服务
在上面例子的基础上,我们再加上一个 消费者,这里将创建一个 ribbonconsumer 工程,访问上面的 服务提供者。
步骤1:先启动 服务提供者的两个实例
java -jar hello-service.jar --server.port=8081
java -jar hello-service.jar --server.port=8082
步骤2:搭建一个消费者
添加依赖:
dependencies {
implementation 'org.springframework.boot:spring-boot-starter'
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-client'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
}
代码:
/**
* @description:
* @author: zhangyunfei
* @date: 2021/5/11 16:35
*/
@RestController
public class ReadController {
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
@Autowired
RestTemplate restTemplate;
@RequestMapping(value = "/read", method = RequestMethod.GET)
public String index() {
return restTemplate.getForEntity("http://HELLO-SERVICE-1/hello", String.class).getBody();
}
private void log(String str) {
System.out.println(str);
}
}
配置文件:
server.port=9001
spring.application.name=ribbonconsumer
eureka.client.serviceUrl.defaultZone=http://peer1:1111/eureka/
步骤3:启动 消费者访问
这时可以看到,每次访问的 “服务提供者的”实例是不一样的。
扩展
我的实例代码地址:https://github.com/vir56k/demo/tree/master/eureka_demo3
参考:
《Spring Cloud微服务实战》
https://docs.spring.io/spring-cloud-netflix/docs/current/reference/html/