spring-cloud构建多提供者轮询
昨天我做了Eureka-Server注册中心的集群,那么我们知道在分布式架构中,最大的特点是微服务可以独立运行,每个模块有自己独立的数据库
今天,我们来看下如何设置多个提供者,意思就是为了减轻数据库的压力,我们可以创建多个相同的提供者,并且创建多个数据库(存放同样的数据)
通过消费者接口负载均衡策略对多个相同的提供者进行轮询访问
如何搭建eureka服务注册与发现,可以翻阅我之前的博客,以及Eureka Server 集群
下面看下今天的功能步骤
1、首先默认创建两个相同的提供者
2、内部业务逻辑代码都可直接复制黏贴,包括pom.xml文件的依赖,mybatis全局配置文件,mapper映射文件
3、将yml文件复制过来后要注意更改当前提供者所需要的数据库信息,以及对应端口号等信息
数据库中存放的数据应该是完全相同的,但此处为了后期演示方便,我会对另外一个数据库进行更改一条数据
tx表中 的数据
users表中的数据
#之前的一个提供者 server: port: 8001 #mybatis的设置 mybatis: config-location: classpath:mybatis/mybatis.cfg.xml # mybatis配置文件所在路径 type-aliases-package: com.ghh.bean # 通过关系映射扫描所有bean别名类所在包 mapper-locations: classpath:mybatis/mapper/**/*.xml # mapper映射文件 spring: application: name: microservice-product #这个很重要,这在以后的服务与服务之间相互调用一般都是根据这个name #对外报漏的微服务名字,在服务注册中心中application下的字段值,eureka会自动变成全大写 datasource: type: com.alibaba.druid.pool.DruidDataSource # 当前数据源操作类型 driver-class-name: com.mysql.cj.jdbc.Driver # mysql驱动包 url: jdbc:mysql://127.0.0.1:3306/users?serverTimezone=GMT%2B8 # 数据库名称 username: root password: root dbcp2: min-idle: 5 # 数据库连接池的最小维持连接数 initial-size: 5 # 初始化连接数 max-total: 5 # 最大连接数 max-wait-millis: 150 # 等待连接获取的最大超时时间 eureka: instance: instance-id: ${spring.application.name}:${server.port} #我的暴露名和端口号 prefer-ip-address: true #访问路径可以显示ip client: register-with-eureka: true #服务注册 true 注册到服务中心 fetchRegistry: true # true 获取注册信息 service-url: #注册到指定的注册中心或集群 defaultZone: http://Eureka7001.com:7001/eureka/,http://Eureka6001.com:6001/eureka/
#复制过来的yml更改
server:
port: 8002 #修改当前提供者的端口号
#mybatis的设置
mybatis:
config-location: classpath:mybatis/mybatis.cfg.xml # mybatis配置文件所在路径
type-aliases-package: com.ghh.bean # 通过关系映射扫描所有bean别名类所在包
mapper-locations: classpath:mybatis/mapper/**/*.xml # mapper映射文件
spring:
application:
name: microservice-product #这个很重要,这在以后的服务与服务之间相互调用一般都是根据这个name
#对外报漏的微服务名字,在服务注册中心中application下的字段值,eureka会自动变成全大写
datasource:
type: com.alibaba.druid.pool.DruidDataSource # 当前数据源操作类型
driver-class-name: com.mysql.cj.jdbc.Driver # mysql驱动包
url: jdbc:mysql://127.0.0.1:3306/tx?serverTimezone=GMT%2B8 # 数据库名称
username: root
password: root
dbcp2:
min-idle: 5 # 数据库连接池的最小维持连接数
initial-size: 5 # 初始化连接数
max-total: 5 # 最大连接数
max-wait-millis: 150 # 等待连接获取的最大超时时间
eureka:
instance:
instance-id: microserivce_cloud_07_provide_product_8002
prefer-ip-address: true #访问路径可以显示ip
client:
register-with-eureka: true #服务注册 true 注册到服务中心
fetchRegistry: true # true 获取注册信息
service-url: #注册到指定的注册中心或集群
defaultZone: http://Eureka7001.com:7001/eureka/,http://Eureka6001.com:6001/eureka/
4、修改完yml文件后,在消费者模块中,我们需要修改之前的配置类,开启负载均衡,默认轮询的方式去访问不同的提供者
此处切记一定不要忘记@LoadBalanced 注解,
Ribbo的负载均衡策略,@LoadBanlanced的默认是轮询,从服务列表中拿到一个服务对应的几个实例,对他们进行默认轮询访问。
@Configuration public class RestConfig { @Bean //通过RestTemplate来实现调用接口 @LoadBalanced //表示RestTemplate开启了负载均衡 public RestTemplate getRestTemplate(){ return new RestTemplate(); } }
5、前面我们配置的spring:application:name:会发现两个提供者是一样,此配置,是将当前模块姓名暴露给其他模块,
此时启动后会在server的服务中心看到多了一个此微服务,且后面有两个,Eureka会默认将我们姓名变大写
注意:
此处切记我们在yml文件中的 MICROSERVICE-PRODUCT 不能写成MICROSERVICE_PRODUCT,下划线Eureka是不支持的
6、此时相当于这两个相同功能的提供者都注册了,我们在消费者接口通过RestTemplate调用
7、效果
8、小技巧,我们在配置中需要其他地方的信息时,可以通过${}来获取,这样以后我们再修改的时候,只要修改上面的信息就行
总结:轮询的方式说到底还是为了缓解tomcat和mysql的压力,我们以后开发分布式架构的项目时,各个微服务,不会放在同一个tomcat中,实现
完完全全的解耦,所以Eureka通过服务注册中心,每一个微服务启动后,到这来注册,通过心跳Server去监控每一个微服务,对访问量比较大的地方
使用多个提供者,多个数据库,并在消费者接口处采用轮询的方式去减轻tomcat压力。
大家共同努力哈,共同努力进步