分布式系统基本组成
-服务提供方(Provider)
-服务消费方(Consumer)
-服务注册中心(Registry)
-服务路由(Router)
-服务代理(Broker)
-通讯协议(Protocol)
高可用架构基本原则
- 消除单点失败
- 可靠性交迭
- 故障探测
Proxy:一般性代理,路由
Broker:包括路由,并且算法
Message Broker:消息路由、消息管理
Eureka服务器
一般不需要自我注册,也不需要注册其他服务器
通常来说,eureka服务器不需要开启自动注册,也不需要检索服务
# 取消服务器自我注册
eureka.client.fetch-registry=false
# 注册中心的服务器,没有必要再去检索服务
eureka.client.register-with-eureka=false
代码实现(基于REST的RPC调用)
项目结构
项目地址
项目说明
eureka高可用架构
高可用注册中心集群
eureka服务器和provider都可以选择多个运行
-
idea多个实例运行
-
配置
##Eureka Server服务URL,用于客户端注册
eureka.client.serviceUr1.defaultZone=
http://localhost:9090/eureka,http://localhost:9091/eureka
- 备注
如果Eureka客户端应用配置多个Eureka注册服务器,那么默认情况只有第一台可用的服务器,存在注册信息。
如果第一台可用的Eureka服务器Down掉了,那么Eureka客户端应用将会选择下一台可用的Eureka服务器。
配置源码(EurekaClientConfigBean)
配置项eureka.client.serviceurl
实际映射的字段为serviceurl
,它是Map类型,Key为自定义,默认值“defaultZone",value是需要配置的Eureka注册服务器URL。
private Map<String, String> serviceUrl = new HashMap<>();
{
this.serviceUrl.put(DEFAULT_ZONE, DEFAULT_URL);
}
获取注册时间的时间间隔
Eureka 客户端需要获取Eureka服务器注册信息,这个方便服务调用。
Eureka 客户端:Eurekaclient,关联应用集合:Applications
单个应用信息:Application
,关联多个应用实例
单个应用实例:InstanceInfo
当Eureka客户端需要调用具体某个服务时,比如user-service-consumer
调用user-service-provider
,user-service-provider
实际对应对象是Application
,关联了许多应用实例(InstanceInfo)。
如果应用user-serlvice-provider
的应用实例发生变化时,那么user-service-consumer
是需要感知的。比如:user-service-provider
机器从10台降到了5台,那么,作为调用方的user-service-consumer
需要知道这个变化情况。可是这个变化过程,可能存在一定的延迟,可以通过调整注册信息时间间隔来减少错误。
配置项
##调整注册信息的获取周期,默认值:30秒
eureka.client.registry-fetch-interval-seconds=5
实例信息复制时间间隔
##调整客户端应用状态信息上报周期
eureka.client.instance-info-replication-interval-seconds=5
Eureka的应用信息获取的方式:拉模式
Eureka的应用信息上报的方式:推模式
实例id
从Eureka Server Dashboard里面可以看到具体某个应用中的实例信息,比如:
其中,它们命名模式:${hostname}:${springapplication.name}:${server.port}
实例类:EurekaInstanceConfigBean
## eureka应用实例的id
eureka.instance.instance-id=${spring.application.name}:${user.name}:consumer
实例端点映射
即上面实例id点进去的链接地址
源码位置:EurekaInstanceConfigBean
private String statusPageUrlPath="/info";
##Eureka 客户端应用实例状态URI
eureka.instance.statusPageUrlPath=/health
构建Eureka服务器相互注册
启动参数: --spring.profiles.active=peer1
配置1 application-peer1.properties
###Eureka Server应用名称
spring.application.name=spring-cloud-eureka-server
###Eureka Server服务端口
server.port=9090
###取消服务器自我注册
eureka.client.register-with-eureka=true
###注册中心的服务器,没有必要再去检索服务
eurekaf.client.fetch-registry=true
##Eureka Server 服务URL,用于客户端注册
##当前Eureka服务器向9091(Eureka服务器)复制数据eureka.client.serviceUrl.defaultZone=\
http://localhost:9091/eureka
启动参数: --spring.profiles.active=peer2
配置2 application-peer2.properties
###Eureka Server应用名称
spring.application.name=spring-cloud-eureka-server
###Eureka Server服务端口
server.port=9091
###取消服务器自我注册
eureka.client.register-with-eureka=true
###注册中心的服务器,没有必要再去检索服务
eureka.client.fetch-registry=true
##Eureka Server 服务URL,用于客户端注册
##当前Eureka服务器向9090(Eureka服务器)复制数据eureka.dlient.serviceUrl.defaultZone=\
http://localhost:9090/eureka
HTTP消息装换器:HttpMessageConvertor
自义定实现
编码问题
HTTP Client 适配工厂:ClientHttpRequestFactory
这个方面主要考虑大家的使用HttpClient偏好:
- Spring实现
- SimpleClientHttpRequestFactory
- HttpClient
- HttpComponentsClientHttpRequestFactory
- OkHtte
- OkHttp3ClientHttpReguestFactory
- OkHttpClientHttpRequestFactory
//切换通讯客户端,提升性能,spring默认的http客户端据说不是很好
RestTemplate restTemplate=new Rest Template(new HttpComponentsClientHttpRequestFactory()); //HttpClient
HTTP 请求拦截器:ClientHttpRequestinterceptor
问题
1.consul和Eureka是一样的吗
答:提供功能类似,consul功能更强大,广播式服务发现/注册
2.重启eureka服务器,客户端应用要重启吗
答:不用,客户端在不停地上报信息,不过在Eureka服务器启动过程中,客户单大量报错
3.生产环境中,consumer是分别注册成多个服务,还是统一放在一起注册成个服务?权限应该如何处理?
答:consumer是否要分为多个服务,要情况,大多数情况是需要,根据应用职责划分。权限根据服务方法需要,比如有些敏感操作的话,可以更具不同用户做鉴权。
4.客户端上报的信息存储在哪里?内存中还是数据库中
答:都是在内存里面缓存着,EurekaClient并不是所有的服务,需要的服务。比如:Eureka Server管理了200个应用,每个应用存在100个实例,总体管理20000个实例。客户端更具自己的需要的应用实例。
5.要是其他模块查询列表里面有用到用户信息怎么办呢是循环调用户接口还是直接关联用户表呢怎么实现好呢
答:用户APl依赖即可
6.consumer 调用Aprovider-a挂了,会自动切换Aprovider-b吗,保证请求可用吗
答:当Aprovider-a挂,会自动切换,不过不一定及时。不及时,服务端可能存在脏数据,或者轮训更新时间未达。
7.一个业务中调用多个service时如何保证事务
答:需要分布式事务实现(JTA),可是一般互联网项目,没有这种昂贵的操作。