公司做网站价格,快速搭建网站域名绑定设置,wordpress ad,网站重要性文章目录 前言一、Ribbon负载均衡1.LoadBalancerInterceptor#xff08;负载均衡拦截器#xff09;2.负载均衡策略IRule 二、Nacos注册中心1.Nacos简介2.搭建Nacos注册中心3.服务分级存储模型4.环境隔离5.Nacos与Eureka的区别 总结 前言
在上面那个文章中介绍了微服务架构的… 文章目录 前言一、Ribbon负载均衡1.LoadBalancerInterceptor负载均衡拦截器2.负载均衡策略IRule 二、Nacos注册中心1.Nacos简介2.搭建Nacos注册中心3.服务分级存储模型4.环境隔离5.Nacos与Eureka的区别 总结 前言
在上面那个文章中介绍了微服务架构的概念以及eureka注册中心的概念在本节中我们将继续介绍微服务技术栈的其他两个组件Ribbon和Nacos。 一、Ribbon负载均衡
1.LoadBalancerInterceptor负载均衡拦截器
在上篇文章中讲到Spring会自动帮助我们从eureka-server端根据userservice这个服务名称获取实例列表而后完成负载均衡。
那么这个负载均衡底层是由谁帮助我们完成的呢?为什么发出的请求明明是http://userservice/user/1怎么变成了http://localhost:8081/user/1的呢
解答SpringCloud底层其实是利用了一个名为Ribbon的组件来实现负载均衡功能的。 接下来我们在源码中追踪一下负载均衡功能的具体实现。 底层源码
request.getURI()获取请求uri本例中就是 http://user-service/user/8originalUri.getHost()获取uri路径的主机名其实就是服务iduser-servicethis.loadBalancer.execute()处理服务id和用户请求。
this.loadBalancer是LoadBalancerClient类型我们继续跟入execute方法。
getLoadBalancer(serviceId)根据服务id获取ILoadBalancer而ILoadBalancer会拿着服务id去eureka中获取服务列表并保存起来。getServer(loadBalancer)利用内置的负载均衡算法从服务列表中选择一个。
2.负载均衡策略IRule
从上面的源码可以看出getServer(loadBalancer)方法利用内置的负载均衡算法从服务列表中选择一个。 继续追踪chooseServer方法发现里面有个rule。 这里的rule默认值是一个RoundRobinRule看类的介绍 RoundRobinRule()是轮询的意思到这里整个负载均衡的流程我们就清楚了。
总结SpringCloudRibbon的底层采用了一个拦截器拦截了RestTemplate发出的请求对地址做了修改。
负载均衡的规则都定义在IRule接口中接下来我们来研究一下IRule接口。 IRule接口有很多不同的实现类不同实现类的含义不同默认的实现就是ZoneAvoidanceRule是一种轮询方案
如果我们要更改负载均衡策略即自定义负载均衡策略我们要怎么办
1.代码方式在order-service中的OrderApplication类中定义一个新的IRule
Bean
public IRule randomRule(){return new RandomRule();
}2.配置文件方式在order-service的application.yml文件中添加新的配置也可以修改规则
userservice: # 给某个微服务配置负载均衡规则这里是userservice服务ribbon:NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule # 负载均衡规则 二、Nacos注册中心
1.Nacos简介
在上篇文章中已经介绍了eureka这个注册中心现在来介绍另外一个注册中心Nacos。Nacos是阿里巴巴的产品现在是SpringCloud中的一个组件。相比EurekaNcaos功能更加丰富在国内受欢迎程度较高。 Nacos是SpringCloudAlibaba的组件而SpringCloudAlibaba也遵循SpringCloud中定义的服务注册、服务发现规范。因此使用Nacos和使用Eureka对于微服务来说并没有太大区别。主要差异在于依赖不同和服务地址不同。
2.搭建Nacos注册中心
1引入依赖 在cloud-demo父工程的pom文件中的dependencyManagement中引入SpringCloudAlibaba的依赖
dependencygroupIdcom.alibaba.cloud/groupIdartifactIdspring-cloud-alibaba-dependencies/artifactIdversion2.2.6.RELEASE/versiontypepom/typescopeimport/scope
/dependency在user-service和order-service中的pom文件中引入nacos-discovery依赖
dependencygroupIdcom.alibaba.cloud/groupIdartifactIdspring-cloud-starter-alibaba-nacos-discovery/artifactId
/dependency2配置nacos地址 在user-service和order-service的application.yml中添加nacos地址
spring:cloud:nacos:server-addr: localhost:8848重启微服务后登录nacos管理页面在服务列表可以查看服务信息。
3.服务分级存储模型
一个服务可以有多个实例假如这些实例分布于全国各地的不同机房nacos就将同一机房内的实例划分为一个集群。 微服务互相访问时应该尽可能访问同集群实例因为本地访问速度更快。当本集群内不可用时才访问其它集群。修改application.yml文件添加集群配置。 cloud:nacos:server-addr: localhost:8848discovery:cluster-name: HZ默认的ZoneAvoidanceRule并不能实现根据同集群优先来实现负载均衡。因此Nacos中提供了一个NacosRule的实现可以优先从同集群中挑选实例。
userservice: # 给某个微服务配置负载均衡规则这里是userservice服务ribbon:NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule # 负载均衡规则因此Nacos提供了权重配置来控制访问频率权重越大则访问频率越高。在nacos控制台找到实例列表点击编辑即可修改权重。如果权重修改为0则该实例永远不会被访问 4.环境隔离
Nacos提供了namespace来实现环境隔离功能 1.nacos中可以有多个namespace。 2.namespace下可以有group、service等。 3.不同namespace之间相互隔离例如不同namespace的服务互相不可见。 给微服务配置namespace只能通过修改配置来实现。例如修改application.yml文件指定命名空间。
spring:cloud:nacos:server-addr: localhost:8848discovery:cluster-name: HZnamespace: 492a7d5d-237b-46a1-a99a-fa8e98e4b0f9 如果order-service和userservice在不同的命名空间下此时访问order-service因为namespace不同会导致找不到。
5.Nacos与Eureka的区别
Nacos的服务实例分为两种类型 1.临时实例如果实例宕机超过一定时间会从服务列表剔除默认的类型。 2.非临时实例如果实例宕机不会从服务列表剔除也可以叫永久实例。 cloud:nacos:server-addr: localhost:8848discovery:cluster-name: HZephemeral: false #设置为非临时实例Nacos和Eureka整体结构类似服务注册、服务拉取、心跳等待。 1.Nacos支持服务端主动检测提供者状态临时实例采用心跳模式非临时实例采用主动检测模式亲儿子 2.临时实例心跳不正常会被剔除非临时实例则不会被剔除。 3.Nacos支持服务列表变更的消息推送模式服务列表更新更及时。 总结
Nacos和Eureka整体结构类似都支持服务注册和服务拉取以及服务提供者心跳方式做健康检测但是也存在一些差异。在后续的文章中我们将学习更多有关nacos的知识包括统一配置中心热更新以及nacos集群。