优点:
架构简单
部署成本低
缺点:
耦合度高
优点:
降低服务耦合
有利于服务升级拓展
分布式架构的要考虑的问题:
服务拆分粒度如何?
服务集群地址如何维护?
服务之间如何实现远程调用?
服务健康状态如何感知?
微服务是一种经过良好架构设计的分布式架构方案,微服务架构特征:
单一职责:微服务拆分粒度更小,每一个服务都对应唯一的业务能力,做到单一职责,避免重复业务开发
面向服务:微服务对外暴露业务接口
自治:团队独立、技术独立、数据独立、部署独立
隔离性强:服务调用做好隔离、容错、降级,避免出现级联问题
Dubbo |
SpringCloud |
SpringCloudAlibaba |
|
注册中心 |
zookeeper、Redis |
Eureka、Consul |
Nacos、Eureka |
服务远程调用 |
Dubbo协议 |
Feign(http协议) |
Dubbo、Feign |
配置中心 |
无 |
SpringCloudConfig |
SpringCloudConfig、Nacos |
服务网关 |
无 |
SpringCloudGateway、Zuul |
SpringCloudGateway、Zuul |
服务监控和保护 |
dubbo-admin,功能弱 |
Hystix |
Sentinel |
服务调用关系:
服务提供者:暴露接口给其它微服务调用
服务消费者:调用其它微服务提供的接口
提供者与消费者角色其实是相对的
一个服务可以同时是服务提供者和服务消费者
服务调用出现的问题:
服务消费者该如何获取服务提供者的地址信息?
如果有多个服务提供者,消费者该如何选择?
消费者如何得知服务提供者的健康状态?
消费者该如何获取服务提供者具体信息?
服务提供者启动时向eureka注册自己的信息
eureka保存这些信息
消费者根据服务名称向eureka拉取提供者信息
如果有多个服务提供者,消费者该如何选择?
服务消费者利用负载均衡算法,从服务列表中挑选一个
消费者如何感知服务提供者健康状态?
服务提供者会每隔30秒向EurekaServer发送心跳请求,报告健康状态
eureka会更新记录服务列表信息,心跳不正常会被剔除
消费者就可以拉取到最新的信息
org.springframework.cloud
spring-cloud-starter-netflix-eureka-server
@EnableEurekaServer
@SpringBootApplication
public class EurekaApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaApplication.class,args);
}
}
server:
port: 10086 #服务端口
spring:
application:
name: eurekaserver #eureka服务名称
eureka:
client:
service-url: #eureka地址信息
defaultZone: http://localhost:10086/eureka/
启动。访问http://localhost:10086/
org.springframework.cloud
spring-cloud-starter-netflix-eureka-client
spring:
application:
name: userservice #eureka服务名称
eureka:
client:
service-url: #eureka地址信息
defaultZone: http://localhost:10086/eureka/
引入eureka-client依赖
在application.yml中配置eureka地址
给RestTemplate添加@LoadBalanced注解
用服务提供者的服务名称远程调用
内置负载均衡规则类 |
规则描述 |
RoundRobinRule |
简单轮询服务列表来选择服务器。它是Ribbon默认的负载均衡规则。 |
AvailabilityFilteringRule |
对以下两种服务器进行忽略: (1)在默认情况下,这台服务器如果3次连接失败,这台服务器就会被设置为“短路”状态。短路状态将持续30秒,如果再次连接失败,短路的持续时间就会几何级地增加。 (2)并发数过高的服务器。如果一个服务器的并发连接数过高,配置了AvailabilityFilteringRule规则的客户端也会将其忽略。并发连接数的上限,可以由客户端的 |
WeightedResponseTimeRule |
为每一个服务器赋予一个权重值。服务器响应时间越长,这个服务器的权重就越小。这个规则会随机选择服务器,这个权重值会影响服务器的选择。 |
ZoneAvoidanceRule |
以区域可用的服务器为基础进行服务器的选择。使用Zone对服务器进行分类,这个Zone可以理解为一个机房、一个机架等。而后再对Zone内的多个服务做轮询。 |
BestAvailableRule |
忽略那些短路的服务器,并选择并发数较低的服务器。 |
RandomRule |
随机选择一个可用的服务器。 |
RetryRule |
重试机制的选择逻辑 |
①在主启动类内定义一个新的IRule
该配置针对所有服务
@Bean
public IRule randomRule(){
return new RandomRule();
}
②配置文件中进行配置
只针对userservice这个微服务
userservice:
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
Ribbon默认是采用懒加载,即第一次访问时才会去创建LoadBalanceClient,请求时间会很长。
而饥饿加载则会在项目启动时创建,降低第一次访问的耗时,通过下面配置开启饥饿加载:
ribbon:
eager-load:
enable: true
clients: userservice
在nacos安装包的bin路径输入startup.cmd -m standalone开启并进入nacos注册中心
nacos登录账号及密码默认都为nacos
spring-cloud-alilbaba的管理依赖
com.alibaba.cloud
spring-cloud-alibaba-dependencies
2.2.5.RELEASE
pom
import
添加nacos客户端依赖
com.alibaba.cloud
spring-cloud-starter-alibaba-nacos-discovery
cloud:
nacos:
server-addr: localhost:8848
一级是服务,例如userservice
二级是集群,例如杭州或上海
三级是实例,例如杭州机房的某台部署了userservice的服务器
服务调用尽可能选择本地集群的服务,跨集群调用延迟较高,本地集群不可访问时,再去访问其它集群
添加集群属性
spring:
cloud:
nacos:
server-addr: localhost:8848
discovery:
cluster-name: SH
修改3个user service微服务其中两个为HZ集群,一个为SH集群,并且更改order service为HZ集群
启动orderservice调用三次userservice,发现还是轮询机制,并没有优先调用同地域
需要在服务调用者配置中加上以下配置
userservice:
ribbon:
NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule
实现功能如下:
优先选择同集群服务实例列表
本地集群找不到提供者,才去其它集群寻找,并且会报警告
确定了可用实例列表后,再采用随机负载均衡挑选实例
Nacos提供了权重配置来控制访问频率,权重越大则访问频率越高
Nacos控制台可以设置实例的权重值,0~1之间
同集群内的多个实例,权重越高被访问的频率越高
权重设置为0则完全不会被访问
基于不同状态进行隔离,比如开发、测试、生产环境数据的隔离
spring:
cloud:
nacos:
server-addr: localhost:8848
discovery:
cluster-name: HZ
namespace: 948b3f90-24d0-45e9-a952-2233ad82c007
在微服务的配置文件内书写namespace并写入到对应命名空间的uuid,可以注册到对对应命名空间。
将服务提供者及服务消费者放在不同命名空间,则无法访问。如下图
1.Nacos与eureka的共同点
都支持服务注册和服务拉取
都支持服务提供者心跳方式做健康检测
2.Nacos与Eureka的区别
Nacos支持服务端主动检测提供者状态:临时实例采用心跳模式,非临时实例采用主动检测模式
临时实例心跳不正常会被剔除,非临时实例则不会被剔除