在Eureka架构中,微服务角色有两类EurekaServer:
什么是消费者提供者?
- 消费者:调用其他服务
- 提供者:被调
A调B,B调C,B是什么角色?
- B的角色要看相对于谁而言
一个服务既可以是消费者又可以是提供者
spring-cloud-starter-netflix-eureka-server
的依赖(版本依赖父工程的版本,所以没写)<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-netflix-eureka-serverartifactId>
dependency>
@EnableEurekaServer
注解server:
port: 1111 # 自定义端口号
spring:
application:
name: eurekaserver # eureka的服务名称
eureka:
client:
service-url: # eureka的地址信息
defaultZone: http://localhost:1111/eureka
spring-cloud-starter-netflix-eureka-client
的依赖<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-netflix-eureka-clientartifactId>
dependency>
spring:
application:
name: xxxservice # 服务的名称
eureka:
client:
service-url:
defaultZone: http://localhost:1111/eureka
下图是注册了两个服务,可以看到两个客户端的服务和eureka的服务都存在。
一个服务注册两个实例:
【服务拉取是基于服务名称获取服务列表,然后在对服务列表做负载均衡】
String url = "http://xxxservice/user/" + …… ;
@Bean
@LoadBalanced //负载均衡的注解,因为上面我们对xxxservice服务创建了两个实例
public RestTemplate restTemplate() {
return new RestTemplate();
}
@LoadBalanced源码分析取到的负载地址:
上面提到IRule接口,这里做一个简单介绍,理解一下负载规则的继承关系
可以通过定义IRule实现修改负载均衡规则,有两种方式:
1、代码方式:在消费者的启动类中,定义一个戏得IRule:
@Bean
public IRule randomRule() {
return new RandomRule();
}
2、配置文件方式:在消费者的application.yml文件中,添加新的配置也可以修改规则:
xxxservice: # 先指定提供者服务名称
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule # 负载均衡规则
注意:
两种方法的作用范围是不一样的,第一种消费者所调的全体服务都是这种规则;第二种指定了提供者的服务名,是有所指的。
Ribbon默认是采用懒加载,及第一次访问时才会五去创建LoadBalanceClient ,请求时间过长。
而饥饿加载则会在项目启动时创建,降低第一次访问的耗时。
配置开启饥饿加载:
ribbon:
eager-load:
enabled: true # 开启饥饿加载
clients: xxxservice # 指定对xxxservice 这一个服务饥饿加载
ribbon:
eager-load:
enabled: true # 开启饥饿加载
clients: # 多个服务
- xxxservice
- zzzservice
Nacos是阿里巴巴的产品,现在是SpringCloud中的一个组件,相比Eureka功能更加丰富。
安装包:
GitHub主页:https://github.com/alibaba/nacos
GitHub的Release下载页:https://github.com/alibaba/nacos/releases
windows的安装与启动很简单,可以参考自己搜索资料进行
就说一下启动的两种方式:
- 1
文件解压后有bin目录,中的startup.cmd双击就可以启动- 2
bin目录下打开cmd,输入启动命令startup.cmd -m standalone
。
启动成功,会有带nacos的banner与网址和completed的显示信息。
http://192.168.150.1:8848/nacos/index.html
会有浏览器窗口,默认账号密码都是nacos
。
spring-cloud-alibaba
的管理依赖:<dependeny>
<groupId>com.alibaba.cloudgroupId>
<artifactId>spring-cloud-alibaba-dependenciesartifactId>
<version>2.2.5.RELEASEversion>
<type>pomtype>
<scope>importscope>
dependeny>
<dependeny>
<groupId>com.alibaba.cloudgroupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discoveryartifactId>
dependeny>
spring:
cloud:
nacos:
server-addr: localhost:8848 # nacos的服务地址(默认就是8848)
一级是服务,例如userservice
二级是集群,例如杭州或上海
三级是实例,例如杭州机房的某台部署了xxxservice的服务器
spring:
cloud:
nacos:
server-addr: localhost:8848
discovery:
cluster-name: HZ # 配置集群名称,即机房位置,例如:HZ,杭州
这是将提供者配置了集群属性(消费者配置同上),当消费者调用时,由于负载均衡的影响,会进行轮询的规则,找到与自己同集群服务优先使用,就要进行负载均衡的修改:
spring:
cloud:
nacos:
server-addr: localhost:8848
discovery:
cluster-name: HZ
yyyservice:
ribbon:
NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule # 负载均衡规则
NacosRule负载均衡策略:
1、优先选择同集群服务实例
2、本地集群找不到提供者,才去其它集群寻找,并且会报警告
3、确定了可用实例列表后,在采用随机负载均衡挑选实例
实例的权重控制:
1、Nacos控制台可以设置实例的权重值,在0~1之间
2、同集群内的多个实例,权重越高被访问的频率越高
3、权重设置为0则完全不会被访问
Nacos中服务存储和数据存储的最外层都是一个名为namespace的东西,用来做最外层隔离。
nacos默认有一个“public (保留空间)”。
新建命名空间的时候,命名空间ID可以不填,会随机生成。
不同namespace下的服务是不可见的
在服务的application.yml,添加namespace:
spring:
cloud:
nacos:
server-addr: localhost:8848
discovery:
cluster-name: SH # 上海
namespace: xxxxxxxxxxxxxxxx # 命名空间ID
服务注册到Nacos时,可以选择注册为临时实例或非临时实例:
spring:
cloud:
nacos:
discovery:
ephemeral: false # 设置非临时实例,默认是true临时
<dependency>
<groupId>com.alibaba.cloudgroupId>
<artifactId>spring-cloud-starter-alibaba-nacos-configartifactId>
dependency>
bootstrap.yml
文件,这个文件是引导文件优先级高于application.yml:spring:
application:
name: xxxservice # 服务名称
profiles:
active: dev # 开发环境,此处是dev
cloud:
nacos:
server-addr: localhost:8848 # nacos地址
config:
file-extension: yaml # 文件名后缀
热更新:服务的配置修改,且修改后不需要重启服务,配置就能生效。
@RefreshScope
@ConfigurationProperties
注解,自动刷新【前缀名与变量名两者拼接与配置文件一致,就能完成属性的自动配置】
微服务启动时会从nacos读取多个配置文件:
无论profile如何变化,[spring-application.name].yaml文件一定会加载,因此多环境贡献配置可以写入这个文件。
【详细建议主攻一下这个环境共享】
搭建集群的基本步骤:
- 搭建数据库,初始化数据表结构
- 下载nacos安装包
- 配置nacos
- 启动nacos集群
- nginx反向代理
配置集群nacos:
- 进入nacos的conf目录,修改配置文件cluster.conf.example,重命名为cluster.conf
- 配IP
- 修改application.properties文件,添加数据库配置
- 配置完成后复制三份模拟,将三个nacos的端口改为不一样的
- 启动nacos,在bin目录下的命令是
startup
nginx的反向代理: