前言
微服务内容:
- 服务调用
- 服务降级
- 服务注册与发现
- 服务熔断
- 负载均衡
- 服务消息队列
- 服务网关
- 配置中心管理
- 自动化构建部署
- 服务监控
- 全链路追踪
- 服务定时任务
- 调度操作
Eureka采用了CS的设计架构,Eureka Sever作为服务注册功能的服务器,它是服务注册中心。而系统中的其他微服务,使用Eureka的客户端连接到 Eureka Server并维持心跳连接。这样系统的维护人员就可以通过Eureka Server来监控系统中各个微服务是否正常运行。
在服务注册与发现中,有一个注册中心。当服务器启动的时候,会把当前自己服务器的信息比如服务地址通讯地址等以别名方式注册到注册中心上。另一方(消费者服务提供者),以该别名的方式去注册中心上获取到实际的服务通讯地址,然后再实现本地RPC调用RPC远程调用框架核心设计思想:在于注册中心,因为使用注册中心管理每个服务与服务之间的一个依赖关系(服务治理概念)。在任何RPC远程框架中,都会有一个注册中心存放服务地址相关信息(接口地址)
一、服务调用
Eureka作为注册中心时,服务调用流程
服务注册:将服务信息注册进注册中心
服务发现:从注册中心上获取服务信息
实质:存key服务命取value闭用地址
1先启动eureka注主册中心
2启动服务提供者服务
3服务启动后会把自身信息(服务地址以别名方式注册进eureka)
4另一个服务在需要调用接口时,使用服务别名去注册中心获取实际的RPC远程调用地址
5调用地址后,底层实际是利用HttpClient技术实现远程调用
6获得服务地址后会缓存在本地jvm内存中,默认每间隔30秒更新—次服务调用地址
1、服务调用总结
注册中心(Eureka)端口:7001 地址:http://eureka7001.com:7001/eureka
支付模块服务:端口:8001,服务名:cloud-payment-service。在注册中心7001注册
- 需要在applicatin.yml配置文件中进行配置(本服务信息和注册服务中心地址)
server:
port: 8001
spring:
application:
name: cloud-payment-service
...
eureka:
client:
#表示是否将自己注册进Eurekaserver默认为true。
register-with-eureka: true
#是否从EurekaServer抓取已有的注册信息,默认为true。单节点无所谓,集群必须设置为true才能配合ribbon使用负载均衡
fetchRegistry: true
service-url:
defaultZone: http://eureka7001.com:7001/eureka #配置注册中心地址
instance:
instance-id: payment8001 #添加此处
prefer-ip-address: true #添加此处
消费服务(调用8001服务):端口:80,服务名:cloud-order-service
- 进行配置
server:
port: 80
spring:
application:
name: cloud-order-service
eureka:
client:
#表示是否将自己注册进Eurekaserver默认为true。
register-with-eureka: true
#是否从EurekaServer抓取已有的注册信息,默认为true。单节点无所谓,集群必须设置为true才能配合ribbon使用负载均衡
fetchRegistry: true
service-url:
defaultZone: http://eureka7001.com:7001/eureka
- controller 中通过RPC调用
启动服务 7001 ,8001,80
浏览器通过80服务访问,消费7001服务;
访问地址:localhost:80/consumer/payment/xxx
二、服务发现
对于注册进eureka里面的微服务,可以通过服务发现来获得该服务的信息
private DiscoveryClient discoveryClient
org.springframework.cloud.client.discovery public interface
DiscoveryClient extends org.springframework.core.Ordered Maven:
org.springframework.cloud:spring-cloud-commons:2.2.1.RELEASE
1、注入bean
@Resource
private DiscoveryClient discoveryClient;
2、调用方法获取服务信息
List< String > services = discoveryClient.getServices();//获取注册的所有服务名称List
List< ServiceInstance > instances = discoveryClient.getInstances(“CLOUD-PAYMENT-SERVICE”); //根据服务名获取服务实例
@GetMapping(value = "/payment/discovery")
public Object discovery() {
List<String> services = discoveryClient.getServices();
for (String service : services) {
log.info("****** element" + service);
}
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;
}
三、Eureka集群
问题:微服务RPC远程服务调用最核心的是什么 高可用,试想你的注册中心只有一个only one,万一它出故障了,会导致整个为服务环境不可用。
解决办法:搭建Eureka注册中心集群,实现负载均衡+故障容错。