基于Spring Cloud的微服务构建学习-3 服务治理:Spring Cloud Eureka
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基于Spring Cloud的微服务构建学习-3 服务治理:Spring Cloud Eureka相关的知识,希望对你有一定的参考价值。
基于Spring Cloud的微服务构建学习-3 服务治理:Spring Cloud Eureka
什么是服务治理
服务治理可以说是微服务架构中最为核心和基础的模块,它主要用来实现各个微服务实例的自动化注册与发现。
为什么需要服务治理模块
在最初构建微服务系统的时候可能服务并不多,我们可以通过做一些静态配置来完成服务调用
此时看着一切都还正常。
随着项目逐渐接近尾声,维护人员需要维护的服务越来越多,越来越复杂,最终形成大量的配置文件,维护将会变得越来越困难。此时,微服务应用实例自动化管理框架变得至关重要。
服务治理框架需要完成什么任务
- 服务注册:在服务治理框架中,通常都会构建一个注册中心,每个服务单元向注册中心登记自己提供的服务,将主机与端口号、版本号、通信协议等一些附加信息告知注册中心,注册中心按服务名分类组织服务清单。
- 服务发现:我们的所有服务都已经注册到注册中心,并且在注册中心是按照服务名分类,并且由注册中心维护者服务的具体位置。所以调用方需要调用某个服务时,需要先和注册中心咨询,注册中心会返回被调用方服务的所有具体位置,调用方在根据某种轮询策略选择一个具体位置进行服务调用。
Netflix Eureka
Spring Cloud Eureka,使用Netflix Eureka来实现服务注册与发现,它既包含了服务端组件,也包含了客户端组件。
Eureka服务端
Eureka服务端,我们也称为服务注册中心,他同其他服务注册中心一样,支持高可用配置。它依托于强一致性提供良好的服务实例可用性,可以应对多种不同的故障场景。
如果Eureka以集群方式部署,当集群中有分片出现故障时,那么Eureka就转入自我保护模式。它允许在分片故障期间继续提供服务的发现和注册,当故障分片恢复运行时,集群中的其他分片会把它们的状态再次同步回来。
Eureka客户端
Eureka客户端,主要处理服务的注册与发现。客户端服务通过注解和参数配置的方式,嵌入在客户端应用程序的代码中,在应用程序运行时,Eureka客户端向注册中心注册自身提供的服务并周期性地发送心跳来更新它的服务租约。同时,他也能从服务端查询当前注册的服务信息并把它们缓存到本地并周期性地刷新服务状态。
服务端与客户端的关系
搭建服务注册中心
1.创建Spring Boot工程,命名为eureka-server,并在pom中加入必要依赖,如下图:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.4.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent><dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka-server</artifactId>
</dependency><dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Camden.SR7</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
2.通过@EnableEurekaServer注解启动一个服务注册中心提供给其他应用进行对话。在Spring boot应用中添加这个注解就能开启此功能。
@EnableEurekaServer
@SpringBootApplication
public class EurekaServerApplication {
public static void main(String[] args) {
new SpringApplicationBuilder(EurekaServerApplication.class).web(true).run(args);
}
}
在默认情况下,该服务注册中心也会将自己作为客户端来尝试注册它自己,所以我们需要禁用它的客户端注册行为,只需在application.properties中增加如下配置:
spring.application.name=eureka-server
server.port=1111
eureka.instance.hostname=localhost
eureka.client.register-with-eureka=false
eureka.client.fetch-registry=false
eureka.client.serviceUrl.defaultZone=http://${eureka.instance.hostname}:${server.port}/eureka/
- spring.application.name是服务名称,会在服务注册中心中看到这个属性的值,也是服务间调用时使用的名字。
- server.port是该服务启动时所使用的端口号。
- eureka.instance.hostname这是自定义参数。
- eureka.client.register-with-eureka因为该应用为注册中心,所以设置为false,代表不向服务注册中心注册自己。
- eureka.client.fetch-registry因为服务注册中心的职责就是维护服务服务实例,它并不需要去检索服务,所以设置为false。
完成上面的配置,在浏览器中输入http:localhost:1111/,如图:
此时的Instances currently registered with Eureka栏是空的,因为还没有服务注册到注册中心。
注册服务提供者(Eureka客户端)
我们可以直接使用上一章创建的Spring Boot应用加入到Eureka的服务治理体系中。
1.修改pom.xml,增加spring cloud eureka模块的依赖。如下:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency><dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Camden.SR7</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
2.修改HelloController类 在日志中打印服务的相关内容:
@RestController
public class HelloController{
private final Logger logger = Logger.getLogger(getClass());
@Autowired
private DiscoveryClient client;
@RequestMapping(value="/hello",method = RequestMethod.GET)
public String index() {
ServiceInstance instance = client.getLocalServiceInstance();
logger.info("/hello , host:"+ instance.getHost() + ", service_id:" + instance.getServiceId());
return "hello world";
}
}
3.在主类中添加@EnableDiscoveryClient注解,激活Eureka中的DiscoveryClient实现(自动化配置,创建DiscoveryClient接口针对Eureka客户端的EurekaDiscoveryClient实例)
@EnableDiscoveryClient
@SpringBootApplication@ComponentScan("com.microservice.web")//引号中填写Controller所在包名
public class SpringbootApplication {public static void main(String[] args) {
SpringApplication.run(SpringbootApplication.class, args);
}
}
4.修改application.properties文件:
spring.application.name=hello-service
eureka.client.serviceUrl.defaultZone=http://localhost:1111/eureka/
- eureka.client.serviceUrl.defaultZone属性指定服务注册中心的地址。
5.分别启动服务注册中心和hello-service服务。结果如下图:
通过访问localhost:8080/hello,直接向该服务发起请求,在控制台可以看到如下图所示:
这些输出的内容就是我们在controller中注入的DiscoveryClient接口对象,从服务注册中心获取的服务相关信息。
以上是关于基于Spring Cloud的微服务构建学习-3 服务治理:Spring Cloud Eureka的主要内容,如果未能解决你的问题,请参考以下文章
基于Spring Cloud的微服务构建学习-3 服务治理-Spring Cloud Eureka之高可用注册中心
基于Spring Cloud的微服务构建学习-2 Spring Boot
基于Spring cloud gateway定制的微服务网关
基于 Spring Cloud + Vue.js完整的微服务架构实战