在任何分布式架构中,都需要找到机器所在的物理地址,这个过程称为服务发现。
服务发现的优点:
- 可以快速对环境中运行的服务实例数量进行水平伸缩
- 将服务的物理位置抽象,由于服务消费者不知道实际服务实例的物理位置,因此可以从可用服务池中添加或移除服务实例
- 有助于提高应用的弹性。当服务实例不可用时,可从内部可用服务列表移除该实例。
服务发现架构
- 微服务通过服务发现代理进行注册
- 通过服务发现代理来查找各个微服务实例的物理位置,通常服务消费者也会在本地缓存它请求的服务实例的物理地址
- 服务发现节点共享微服务实例的健康信息
- 微服务向服务发现代理发送心跳包,如果微服务不可用,则服务发现节点将移除对应实例IP
本文使用Spring Cloud和Netflix的Eureka服务发现引擎来实现服务发现模式。
客户端负载均衡,使用Spring Cloud和Netflix的Ribbon库
本文源码可在此找到:https://github.com/Alexaccele/SpringCloudDemo
本文测试模块介绍
构建Eureka服务——服务代理
添加maven依赖
除了引入spring cloud以外,主要引入如下依赖,以支持Eureka库1
2
3
4<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
配置文件
1 | server: |
上面的最后一项属性在这里之所以注释掉,是为了能够快速的启动Eureka服务。
Eureka服务启动类
1 | import org.springframework.boot.SpringApplication; |
这里重要的只是@EnableEurekaServer注解,用于在spring服务中启动Eureka服务器。
将服务注册到Eureka服务器
添加maven依赖
1 | <dependency> |
引入Eureka库,以便可以用Eureka进行服务注册
配置文件
1 | spring: |
其中的spring.application.name属性应该写在bootstrap.yml配置文件中,用于确定该服务的应用程序ID,而其余配置则应该写入我们通常所使用的application.yml文件中。
注意当多个服务要部署在本地时,应该注意区别每个服务的端口号应该不能冲突。
此时运行两个应用程序,可以在 http://localhost:8761/eureka/apps 中查看相关注册服务的信息。
使用服务发现来查找服务
使用Spring DiscoveryClient查找服务实例
首先在该应用程序的引导类中加入@EnableDiscoveryClient
注解,使应用程序能够使用DiscoveryClient和Ribbon库
1 | @Component |
使用带有Ribbon功能的Spring RestTemplate调用服务
1 | @Component |
如果要将Ribbon和RestTemplate一起使用,必须使用@LoadBalanced
注解进行显示标注
调用服务发现
1 | @RestController |
服务提供者
一个简单的服务提供者,实现获取相应信息的服务
1 | @SpringBootApplication |
测试
启动服务发现代理之后,再启动服务提供者和服务消费者,并在postman中进行测试,结果如下:
服务消费者成功的调用了注册在服务代理中的服务。