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压力。

 

大家共同努力哈,共同努力进步

posted @ 2019-11-08 12:33  愤青程序猿  阅读(1458)  评论(0编辑  收藏  举报