注册RestTemplate
?提供者与消费者
服务提供者:一次业务中,被其它微服务调用的服务。(提供接口给其它微服务) 服务消费者:一次业务中,调用其它微服务的服务。(调用其它微服务提供的接口 服务A调用服务B,服务B调用服务C,那么服务B是什么角色?---提供者与消费者角色其实是相对的 一个服务可以同时是服务提供者和服务消费者
Eureka服务注册
? ? ? ?就是把每个服务注册在Eureka中
1:创建eureka-server模块? ? ??
?导入依赖
spring-cloud-starter-netflix-eureka-server
eureka-server模块要在xml中配置
spring:
application:
name: eurekaserver # eureka的服务名称
eureka:
client:
service-url: # eureka的地址信息
defaultZone: http://127.0.0.1:10086/eureka
2:创建eureka的客户端(order-service和user-service模块)
导入依赖? ? ? ?
????????spring-cloud-starter-netflix-eureka-client
客户端配置xml
spring:
application:
name: orderserver # order-service的服务名称
eureka:
client:
service-url: # eureka的地址信息
defaultZone: http://127.0.0.1:10086/eureka
spring:
application:
name: userserver # user-service的服务名称
eureka:
client:
service-url: # eureka的地址信息
defaultZone: http://127.0.0.1:10086/eureka
3:访问eureka注册信息
boot启动eureka-service模块和两个客户端模块,然后浏览器访问http://localhost:10086/
?4:模拟多实例部署
? ? ? ? 将userservice启动多次
?浏览器再次访问eureka,查看注册信息,发现多一个
Eureka服务发现
开启负载均衡策略
?服务拉取是基于服务名称获取服务列表,然后在对服务列表做负载均衡 修改OrderService的代码,修改访问的url路径,用服务名代替ip、端口:
?负载均衡的流程
负载均衡策略
方式一:改变负载均衡的策略(代码方式)
作用范围:order访问任何微服务都按这个策略来
/**
* 更改负载均衡的策略
*/
@Bean
public IRule randomRule() {
return new RandomRule();
}
方式二:改变负载均衡的策略(xml方式)
作用范围:只针对orderService而言的
# 负载均衡规则
userservice:
ribbon:
NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule
饥饿加载
Ribbon默认是采用懒加载,即第一次访问时才会去创建LoadBalanceClient,请求时间会很长。 而饥饿加载则会在项目启动时创建,降低第一次访问的耗时,通过下面配置开启饥饿加载:
xml配置
ribbon:
eager-load:
enabled: true # 开启饥饿加载
clients: # 指定饥饿加载的服务名称--可以写多个服务名称
- userservice
Nacos注册中心
Nacos是阿里巴巴的产品,现在是SpringCloud中的一个组件。相比Eureka功能更加丰富,在国内受欢迎程度较高
安装:解压到E:\Enviroment
单机启动
E:\Enviroment\nacos\bin
startup.cmd -m standalone
访问
浏览器 http://127.0.0.1:8848/nacos(账户密码默认是nacos)
?引入依赖
父工程spring-cloud-alibaba-dependencies
子模块把eureca的依赖注释掉,然后添加依赖
spring-cloud-starter-alibaba-nacos-discovery
spring-cloud-starter-alibaba-nacos-config
nacos的xml配置
?(orderservice和userservice服务都要配置)
spring:
cloud:
nacos:
server-addr: 127.0.0.1:8848 # nacos服务地址
# discovery:
# namespace: 4d6ce343-9e1b-44df-a90f-2cf2b6b3d177 # dev环境
# ephemeral: false # 是否是临时实例
启动并测试:
Nacos服务分级存储模型
问题:一个服务(userservice)有多个实例(userservice:8081、userservice:8082)
?当实例太多时,如果把所有的实例放一个地方容易不安全。所以,我们会把一个服务的多个实例部署到多个机房。
同在一个机房的多个实例,叫一个集群
一个服务可以有多个集群,一个集群可以有多个实例
?服务跨集群调用问题
服务调用尽可能选择本地集群的服务,跨集群调用延迟较高 本地集群不可访问时,再去访问其它集群
集群配置
指定哪些实例,是一个集群。(同一个实例的,cluster-name用一个名字就表示一个集群)
这里配置UserApplication 、UserApplication2是一个集群,集群名是HZ
?boot启动orderserviceApplication和UserApplication 、UserApplication2
浏览器访问? ?http://127.0.0.1:8848/nacos
NacosRule负载均衡策略
优先选择同集群服务实例列表 本地集群找不到提供者,才去其它集群寻找,并且会报警告 确定了可用实例列表后,再采用随机负载均衡挑选实例
# 负载均衡规则
userservice:
ribbon:
NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule
服务实例的权重设置
问题:实际部署中会出现这样的场景: 服务器设备性能有差异,部分实例所在机器性能较好,另一些较差,我们希望性能好的机器承担更多的用户请求 Nacos提供了权重配置来控制访问频率,权重越大则访问频率越高
?实例的权重控制
????????Nacos控制台可以设置实例的权重值,0~1之间
????????同集群内的多个实例,权重越高被访问的频率越高
????????权重设置为0则完全不会被访问
浏览器的nacos的权重设置(服务管理-服务列表-详情里设置-编辑-权重)
环境隔离(namespace)
? ? ? 不同环境的模块互相访问不了,相互隔离
nacos查看命名空间,发现只有个默认的
?新建命名空间
?命名空间创建成功,并且产生一个该命名空间的唯一id
?xml配置
?nacos查看,该模块跑到dev环境中啦
Nacos与eureka的共同点
????????都支持服务注册和服务拉取
? ? ? ? 都支持服务提供者心跳方式做健康检测
Nacos与Eureka的区别
???????? Nacos支持服务端主动检测提供者状态:临时实例采用心跳模式,非临时实例采用主动检测模式
???????? 临时实例心跳不正常会被剔除,非临时实例则不会被剔除
????????Nacos支持服务列表变更的消息推送模式,服务列表更新更及时
????????Nacos集群默认采用AP方式,当集群中存在非临时实例时,采用CP模式;Eureka采用AP方式
临时实例和非临时实例
????????临时实例宕机时,会从nacos的服务列表中剔除,而非临时实例则不会
XML配置
统一配置管理
????????配置更改热更新(不用重启服务就能生效)
?新建配置:配置文件的id格式(服务名+profile+后缀名)
添加成功?
?微服务配置拉取
?引入依赖(nacos的配置管理客户端依赖)? ? ??
????????spring-cloud-starter-alibaba-nacos-config
在userservice中的resource目录创建一个bootstrap.yml文件,这个文件是引导文件,优先级高于application.yml:
再把application和bootstrap的重复信息删除就行
获取nacos配置的信息
方式一:@Value("${pattern.dateformat}")获取
在类上添加@RefreshScope的注解
????????(配置自动刷新--微服务不用重启,就能热获取 nacos的配置信息(这里配的是时间格式))
方式二:configurationproperties()推荐
?测试
?浏览器访问
?在nacos修改时间的格式
?再次访问,发现nacos热配置成功
多环境配置共享
?新建配置(这是是共享的,无论在什么环境)?
获取配置信息
浏览器访问,已经读取到
?改变下环境,再次浏览器访问试试---发现仍然能拿到值
多种配置的优先级:
????????服务名-profile.yaml ?>服务名称.yaml ?> ?本地项目配置
Nacos的集群搭建
解压nacos-server-1.4.1.zip,成nacos文件夹
????????Nacos生产环境下一定要部署为集群状态
配置cluster.conf和application.properties文件
?把nacos文件夹复制三份,分别命名nacos1、nacos2、nacos3
然后在application.properties文件把端口分别设置8845、8846、8847
对3个nacos进行启动
每个nacos文件夹的bin目录cmd输入(不带-m就默认是集群启动)
startup.cmd
配置ngnix
?启动ngnix服务器
????????(在E:\Enviroment\nginx-1.22.0目录进行cmd输入start ngnix)
访问(localhost:80/nacos)
?修改yml的端口号(和ngnix保持一致),并启动user-service项目
?nacos就有了
?新建配置
?新建成功
?发现新建配置后,数据库多了一条数据
http客户端Feign
?问题:
用Feign客户端代替RestTemplate
引入依赖
spring-cloud-starter-openfeign
添加注解@EnableFeignClients? ? //开启feign自动装配功能
?编写客户端,做接口声明
?修改yml中nacos服务地址的端口号为80(和nginx配置监听端口号保持一致)
?启动orderservice服务和userservice服务
????????检查nacos是否注册进来了
访问
自定义Feign的配置
更改日志级别(?xml方式) ? ? ? ? 默认是none
方式二:代码方式
性能优化
?引入依赖
????????feign-httpclient
yml配置
feign:
httpclient:
enabled: true # 支持HttpClient的开关
max-connections: 200 # 最大连接数
max-connections-per-route: 50 # 单个路径的最大连接数
Feign的最佳实践
?
最佳实践方式二(抽取)
首先创建一个module,命名为feign-api,并引入feign的starter依赖
????????spring-cloud-starter-openfeign
将order-service中编写的UserClient、User、DefaultFeignConfiguration都剪切到feign-api项目中
在order-service中引入feign-api的依赖(这个依赖就是刚刚创建的feign-api模块)
修改order-service中的所有与上述三个组件有关的import部分,改成导入feign-api中的包 重启测试
网关Gateway
????????使用GateWay网关进行服务请求路由的统一管理,它是系统对外的唯一入口
为什么需要网关?
创建gateway模块
?引入依赖
????????spring-cloud-starter-gateway?
????????spring-cloud-starter-alibaba-nacos-discovery
|