Eureka注册中心
操作流程
1)EurekaServer
- 引用依赖 //引入服务端的依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
-
启动类加注解 //@EnableEurekaServer
-
application.yml配置
server:
port: 10086 #服务端口
spring:
application:
name: eureka_server #eureka的服务名称
eureka:
client:
service-url:
defaultZone: http://127.0.0.1:10086/eureka #eureka的地址信息
2)提供者-服务注册
- 引用依赖 //引入客户端的依赖
- application.yml配置
server:
port: 8080
spring:
application:
name: providerservice #provider_service提示有问题,自己留意
eureka:
client:
service-url:
defaultZone: http://127.0.0.1:10086/eureka
3)消费者-服务发现
- 引用依赖 //引入客户端的依赖
- application.yml配置
server:
port: 8081
spring:
application:
name: consumerservice #consumer_service提示有问题,自己留意
eureka:
client:
service-url:
defaultZone: http://127.0.0.1:10086/eureka
- 在配置类中注册使用RestTemplate,添加@LoadBalanced负载均衡,即使只有一个服务也需要添加该注解
@Bean
@LoadBalanced
public RestTemplate restTemplate(){
return new RestTemplate();
}
- 用服务提供者的服务名称进行远程调用
涨知识:
-
IDEA开启一个新的服务
-
选中要copy的服务,按住ctrl+d,或者右键copy Configuration,记得修改Name和端口
-Dserver.port=8888
总结:
和zookeeper很像,也是通过服务注册、拉取的方式实现远程调用。
如果服务名用下划线分割会出错,如provider_service会提示找不到,不知道为什么,可以自己留意下。
@LoadBalanced的含义:Ribbon负载均衡
Ribbon负载均衡
原理解析
图片——黑马程序员
@LoadBalanced原理
- 当使用@LoadBalanced注解,相当于使用一个拦截器拦截住了请求
- LoadBalancerInterceptor负载均衡拦截器,请求交给RibbonLoadBalancerClient //获取url中的主机名,即服务id
- 然后调用DynamicServerListLoadBalancer //将获取到的主机名(服务id)从eureka-server中拉取服务,返回获取服务列表
- 调用IRule基于负载均衡的规则:轮询、随机,从服务列表中选择一个服务,返回给RibbonLoadBalancerClient
- RibbonLoadBalancerClient将这个服务名称替换url中的主机名,得到一个真实的主机地址,进行访问。
Ribbon负载均衡策略
负载均衡策略图
负载均衡规则
修改负载均衡规则
方法一:代码方式
- 全局的生效,调用哪个微服务都是使用该规则
@Bean
// return new RandomRule();// 随机
// return new RoundRobinRule();// 轮询
// return new RetryRule();
public IRule myRule(){
return new RandomRule();
}
方法二:配置方式
- 通过修改配置文件,针对某个微服务而言
userservice: //针对某个微服务的服务名称
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule #负载均衡规则的全类名
加载规则
1)懒加载
默认懒加载,即第一次使用的时候才会去加载loadBalanceClient,请求时间会比较长。
2)饥饿记载
项目启动时创建,降低第一次访问的耗时,通过下面配置开启饥饿加载:
ribbon:
eager-load:
enabled: true #开启饥饿加载
clients: userservice #指定对userservice这个服务饥饿加载,可以添加多个,用 “- 数组表达”
Nacos注册中心
- Nacos是阿里巴巴的产品,现在是springcloud中的一个组件。相比Eureka功能更加丰富,在国内受欢迎程度较高。
快速入门
1. windows安装和启动
-
解压
-
通过命令执行
startup.cmd -m standalone
- 登录页面http://192.168.254.93:8848/nacos/index.html#/login
启动成功!!
2. 使用步骤
nacas和eureka在使用上都遵循这相同的接口,由eureka转向nacos只需要:
1)更改依赖
父工程依赖:
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.2.5.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
客户端依赖:
<!-- nacos客户端依赖包 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
2) 更改配置文件中注册中心的地址,注释eureka地址,添加nacos地址:
spring:
cloud:
nacos:
server-addr: localhost:8848 #nacos服务地址
#eureka:
# client:
# service-url:
# defaultZone: http://127.0.0.1:10086/eureka
3. 测试
记得开启nacos,再开启服务,测试成功,途中有遇到问题,用2.2.7就一直报错,2.2.5又可以了。
非常清新友好的界面!
Nacos服务分级模型
1)Nacos服务分级存储模型
- 一级是服务,例如userservice
- 二级是集群,例如杭州或上海
- 三级是实例,列入杭州机房的某台部署了userservice额服务器
2)如何设置实例的集群属性
- 修改application.yml文件,添加spring.cloud.nacos.discovery.cluster-name属性即可
spring:
cloud:
nacos:
server-addr: localhost:8848 #nacos服务地址
discovery:
cluster-name: SH
结果:
Nacos负载均衡
NacosRule根据集群负载均衡
- 设置负载均衡和Ribbon一样,Nacos提供了优先查询本地集群内的服务,再进行随机,进行负载均衡。—
NacosRule
#负载均衡的规则
userservice: #要做配置的微服务名称
ribbon:
NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule
- 当Order在集群SZ,User1、2在集群SZ,User3在集群SH,Order的请求都会优先访问User1、2服务,当User1、2挂掉的时候,会访问User3,同时发出警告日志。 -----一个跨集群的请求
04-10 18:16:29:711 WARN 13716 --- [io-8080-exec-10] c.alibaba.cloud.nacos.ribbon.NacosRule :
A cross-cluster call occurs,name = userservice, clusterName = SZ, instance = [Instance{instanceId='192.168.254.93#8083#SH#DEFAULT_GROUP@@userservice', ip='192.168.254.93', port=8083, weight=1.0, healthy=true, enabled=true, ephemeral=true, clusterName='SH', serviceName='DEFAULT_GROUP@@userservice', metadata={preserved.register.source=SPRING_CLOUD}}]
Nacos权重负载均衡
-
直接在Nacos控制台页面设置权重值 0~1之间
-
同集群内的多个实例,权重越高被访问的频率约高
-
权重设置为0则完全不会被访问
Nacos环境隔离
- namespace用来做环境隔离
- 每个namespace都有唯一id
- 不同namespace下的服务都不可见
Nacos和Eureka的区别
共同点:
- 都支持服务注册和服务拉取 —(都是注册中心)
- 都支持服务提供者心跳方式做健康监测
不同点:
-
Nacos支持服务端主动监测提供者状态:临时实例采用心跳模式,非临时实例采用主动监测模式;而Eureka只能采用心跳模式
-
临时实例心跳不正常会被剔除,非临时实例则不会被剔除 ----(临时实例捡的孩子,非临时实例不离不弃)
-
Nacos支持服务列表变更的消息推送服务,服务列表更新更及时
- 一旦Nacos列表有什么变动,注册中心会主动推送服务列表给消费者(服务拉取端),而Eureka不能,所以信息会比较停滞
-
Nacos集群默认采用AP方式,当集群中存在非临时实例时,采用CP模式;Eureka采用Ap方式
reka的区别
共同点:
- 都支持服务注册和服务拉取 —(都是注册中心)
- 都支持服务提供者心跳方式做健康监测
不同点:
-
Nacos支持服务端主动监测提供者状态:临时实例采用心跳模式,非临时实例采用主动监测模式;而Eureka只能采用心跳模式
-
临时实例心跳不正常会被剔除,非临时实例则不会被剔除 ----(临时实例是捡的孩子,非临时实例是不离不弃的亲生孩子)
-
Nacos支持服务列表变更的消息推送服务,服务列表更新更及时
- 一旦Nacos列表有什么变动,注册中心会主动推送服务列表给消费者(服务拉取端),而Eureka不能,所以信息会比较停滞
-
Nacos集群默认采用AP方式,当集群中存在非临时实例时,采用CP模式;Eureka采用Ap方式