springcloud+eureka+ribbon多服务负载均衡(2)

╰+攻爆jí腚メ 2022-03-30 08:16 257阅读 0赞

这一次,我们的服务方有两个(8888,9999),然后都注册到eureka上,但是要注意是注册使用同一个服务名称,消费方可以通过ribbon,根据指定的负载均衡算法访问到服务方。
所有服务如下图:
在这里插入图片描述

1eureka注册中心 microservicecloud-Eureka-7001

在这里插入图片描述
pom.xml

  1. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  2. <modelVersion>4.0.0</modelVersion>
  3. <parent>
  4. <groupId>com.wuk.springcloud</groupId>
  5. <artifactId>microservicecloud</artifactId>
  6. <version>0.0.1-SNAPSHOT</version>
  7. </parent>
  8. <artifactId>microservicecloud-Eureka-7001</artifactId>
  9. <dependencies>
  10. <!--eureka-server服务端 -->
  11. <dependency>
  12. <groupId>org.springframework.cloud</groupId>
  13. <artifactId>spring-cloud-starter-eureka-server</artifactId>
  14. </dependency>
  15. <!-- 修改后立即生效,热部署 -->
  16. <dependency>
  17. <groupId>org.springframework</groupId>
  18. <artifactId>springloaded</artifactId>
  19. </dependency>
  20. <dependency>
  21. <groupId>org.springframework.boot</groupId>
  22. <artifactId>spring-boot-devtools</artifactId>
  23. </dependency>
  24. </dependencies>
  25. </project>

application.yml

  1. server:
  2. port: 7001
  3. eureka:
  4. instance:
  5. hostname: localhost #eureka服务端的实例名称
  6. client:
  7. register-with-eureka: false #false表示不向注册中心注册自己。
  8. fetch-registry: false #false表示自己端就是注册中心,我的职责就是维护服务实例,并不需要去检索服务
  9. service-url:
  10. defaultZone: http://${ eureka.instance.hostname}:${ server.port}/eureka/ #设置与Eureka Server交互的地址查询服务和注册服务都需要依赖这个地址。

EurekaServer7001_App.java

  1. package com.wuk;
  2. import org.springframework.boot.SpringApplication;
  3. import org.springframework.boot.autoconfigure.SpringBootApplication;
  4. import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
  5. @SpringBootApplication
  6. @EnableEurekaServer //EurekaServer服务器端启动类,接受其它微服务注册进来
  7. public class EurekaServer7001_App {
  8. public static void main(String[] args) {
  9. SpringApplication.run(EurekaServer7001_App.class, args);
  10. }
  11. }

2 服务方8888 microservicecloud-dept-8888

它有单独的数据库

在这里插入图片描述
它的数据库

在这里插入图片描述
pom.xml

  1. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  2. <modelVersion>4.0.0</modelVersion>
  3. <parent>
  4. <groupId>com.wuk.springcloud</groupId>
  5. <artifactId>microservicecloud</artifactId>
  6. <version>0.0.1-SNAPSHOT</version>
  7. </parent>
  8. <artifactId>microservicecloud-dept-8888</artifactId>
  9. <dependencies>
  10. <dependency>
  11. <groupId>com.wuk.springcloud</groupId>
  12. <artifactId>microservicecloud-api</artifactId>
  13. <version>${project.version}</version>
  14. </dependency>
  15. <dependency>
  16. <groupId>junit</groupId>
  17. <artifactId>junit</artifactId>
  18. </dependency>
  19. <dependency>
  20. <groupId>mysql</groupId>
  21. <artifactId>mysql-connector-java</artifactId>
  22. </dependency>
  23. <dependency>
  24. <groupId>com.alibaba</groupId>
  25. <artifactId>druid</artifactId>
  26. </dependency>
  27. <dependency>
  28. <groupId>ch.qos.logback</groupId>
  29. <artifactId>logback-core</artifactId>
  30. </dependency>
  31. <dependency>
  32. <groupId>org.mybatis.spring.boot</groupId>
  33. <artifactId>mybatis-spring-boot-starter</artifactId>
  34. </dependency>
  35. <dependency>
  36. <groupId>org.springframework.boot</groupId>
  37. <artifactId>spring-boot-starter-jetty</artifactId>
  38. </dependency>
  39. <dependency>
  40. <groupId>org.springframework.boot</groupId>
  41. <artifactId>spring-boot-starter-web</artifactId>
  42. </dependency>
  43. <dependency>
  44. <groupId>org.springframework.boot</groupId>
  45. <artifactId>spring-boot-starter-test</artifactId>
  46. </dependency>
  47. <!-- 修改后立即生效,热部署 -->
  48. <dependency>
  49. <groupId>org.springframework</groupId>
  50. <artifactId>springloaded</artifactId>
  51. </dependency>
  52. <dependency>
  53. <groupId>org.springframework.boot</groupId>
  54. <artifactId>spring-boot-devtools</artifactId>
  55. </dependency>
  56. <!-- 将微服务provider侧注册进eureka -->
  57. <dependency>
  58. <groupId>org.springframework.cloud</groupId>
  59. <artifactId>spring-cloud-starter-eureka</artifactId>
  60. </dependency>
  61. <dependency>
  62. <groupId>org.springframework.cloud</groupId>
  63. <artifactId>spring-cloud-starter-config</artifactId>
  64. </dependency>
  65. </dependencies>
  66. </project>

application.yml
要注意的地方就是两个服务要注册到一个服务名上

  1. server:
  2. port: 8888
  3. mybatis:
  4. config-location: classpath:mybatis/mybatis.cfg.xml # mybatis配置文件所在路径
  5. type-aliases-package: com.wuk.entity # 所有Entity别名类所在包
  6. mapper-locations:
  7. - classpath:mybatis/mapper/**/*.xml
  8. spring:
  9. application:
  10. name: producers #注册在eureka上的服务名称,后续消费方访问要用它,如果多个服务负载均衡,就要保持一致
  11. datasource:
  12. type: com.alibaba.druid.pool.DruidDataSource # 当前数据源操作类型
  13. driver-class-name: org.gjt.mm.mysql.Driver # mysql驱动包
  14. url: jdbc:mysql://127.0.0.1:3306/cloudDB01 # 数据库名称
  15. username: root
  16. password: 123456
  17. dbcp2:
  18. min-idle: 5 # 数据库连接池的最小维持连接数
  19. initial-size: 5 # 初始化连接数
  20. max-total: 5 # 最大连接数
  21. max-wait-millis: 200 # 等待连接获取的最大超时时间
  22. eureka:
  23. client: #客户端注册进eureka服务列表内
  24. service-url:
  25. defaultZone: http://localhost:7001/eureka
  26. instance:
  27. instance-id: microservicecloud-dept-8888 #自定义服务名称
  28. prefer-ip-address: true #显示服务ip

其他的文件上一篇有,不做赘述。

3 服务9999 microservicecloud-dept-9999

在这里插入图片描述
数据库如下:
在这里插入图片描述
pom.xml

  1. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  2. <modelVersion>4.0.0</modelVersion>
  3. <parent>
  4. <groupId>com.wuk.springcloud</groupId>
  5. <artifactId>microservicecloud</artifactId>
  6. <version>0.0.1-SNAPSHOT</version>
  7. </parent>
  8. <artifactId>microservicecloud-dept-9999</artifactId>
  9. <dependencies>
  10. <dependency>
  11. <groupId>com.wuk.springcloud</groupId>
  12. <artifactId>microservicecloud-api</artifactId>
  13. <version>${project.version}</version>
  14. </dependency>
  15. <dependency>
  16. <groupId>junit</groupId>
  17. <artifactId>junit</artifactId>
  18. </dependency>
  19. <dependency>
  20. <groupId>mysql</groupId>
  21. <artifactId>mysql-connector-java</artifactId>
  22. </dependency>
  23. <dependency>
  24. <groupId>com.alibaba</groupId>
  25. <artifactId>druid</artifactId>
  26. </dependency>
  27. <dependency>
  28. <groupId>ch.qos.logback</groupId>
  29. <artifactId>logback-core</artifactId>
  30. </dependency>
  31. <dependency>
  32. <groupId>org.mybatis.spring.boot</groupId>
  33. <artifactId>mybatis-spring-boot-starter</artifactId>
  34. </dependency>
  35. <dependency>
  36. <groupId>org.springframework.boot</groupId>
  37. <artifactId>spring-boot-starter-jetty</artifactId>
  38. </dependency>
  39. <dependency>
  40. <groupId>org.springframework.boot</groupId>
  41. <artifactId>spring-boot-starter-web</artifactId>
  42. </dependency>
  43. <dependency>
  44. <groupId>org.springframework.boot</groupId>
  45. <artifactId>spring-boot-starter-test</artifactId>
  46. </dependency>
  47. <!-- 修改后立即生效,热部署 -->
  48. <dependency>
  49. <groupId>org.springframework</groupId>
  50. <artifactId>springloaded</artifactId>
  51. </dependency>
  52. <dependency>
  53. <groupId>org.springframework.boot</groupId>
  54. <artifactId>spring-boot-devtools</artifactId>
  55. </dependency>
  56. <!-- 将微服务provider注册进eureka -->
  57. <dependency>
  58. <groupId>org.springframework.cloud</groupId>
  59. <artifactId>spring-cloud-starter-eureka</artifactId>
  60. </dependency>
  61. <dependency>
  62. <groupId>org.springframework.cloud</groupId>
  63. <artifactId>spring-cloud-starter-config</artifactId>
  64. </dependency>
  65. </dependencies>
  66. </project>

application.yml

  1. server:
  2. port: 9999
  3. mybatis:
  4. config-location: classpath:mybatis/mybatis.cfg.xml # mybatis配置文件所在路径
  5. type-aliases-package: com.wuk.entity # 所有Entity别名类所在包
  6. mapper-locations:
  7. - classpath:mybatis/mapper/**/*.xml
  8. spring:
  9. application:
  10. name: producers #注册在eureka上的服务名称,后续消费方访问要用它,如果多个服务负载均衡,就要保持一致
  11. datasource:
  12. type: com.alibaba.druid.pool.DruidDataSource # 当前数据源操作类型
  13. driver-class-name: org.gjt.mm.mysql.Driver # mysql驱动包
  14. url: jdbc:mysql://127.0.0.1:3306/cloudDB02 # 数据库名称
  15. username: root
  16. password: 123456
  17. dbcp2:
  18. min-idle: 5 # 数据库连接池的最小维持连接数
  19. initial-size: 5 # 初始化连接数
  20. max-total: 5 # 最大连接数
  21. max-wait-millis: 200 # 等待连接获取的最大超时时间
  22. eureka:
  23. client: #客户端注册进eureka服务列表内
  24. service-url:
  25. defaultZone: http://localhost:7001/eureka
  26. instance:
  27. instance-id: microservicecloud-dept-9999 #自定义服务名称
  28. prefer-ip-address: true #显示服务ip

4 消费方 microservicecloud-consumer-dept-80

在这里插入图片描述
ConfigBean.java
注意这里ribbon提供的几个负载均衡算法
算法有:

  1. RoundRobinRule()轮询
  2. RandomRule()随机
  3. AvailabilityFilteringRule()先轮询,过滤掉故障服务,然后再按照轮询方式
  4. WeightedResponseTimeRule()在最开始先轮询,然后统计响应时间,等到数据足够,计算出权重,然后切换到该算法,响应时间短的容易被选中
  5. RetryRule() 先轮询,如果服务失败,然后在指定时间内进行重试,获取可用服务
  6. BestAvailableRule()先过滤掉由于多次访问故障而处于断路或者跳闸的服务,然后选择一个并发量小的服务

    package com.wuk.cfgbeans;

    import org.springframework.cloud.client.loadbalancer.LoadBalanced;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.web.client.RestTemplate;

    import com.netflix.loadbalancer.AvailabilityFilteringRule;
    import com.netflix.loadbalancer.BestAvailableRule;
    import com.netflix.loadbalancer.IRule;
    import com.netflix.loadbalancer.RandomRule;
    import com.netflix.loadbalancer.RetryRule;
    import com.netflix.loadbalancer.RoundRobinRule;
    import com.netflix.loadbalancer.WeightedResponseTimeRule;

  1. @Configuration
  2. public class ConfigBean {
  3. /** * RestTemplate提供了多种便捷访问远程Http服务的方法, 是一种简单便捷的访问restful服务模板类,是Spring提供的用于访问Rest服务的客户端模板工具集 * @return */
  4. @LoadBalanced
  5. @Bean
  6. public RestTemplate getRestTemplate() {
  7. return new RestTemplate();
  8. }
  9. @Bean
  10. public IRule myRule() {
  11. //RoundRobinRule()轮询
  12. //RandomRule()随机
  13. //AvailabilityFilteringRule()先轮询,过滤掉故障服务,然后再按照轮询方式
  14. //WeightedResponseTimeRule()在最开始先轮询,然后统计响应时间,等到数据足够,计算出权重,然后切换到该算法,响应时间短的容易被选中
  15. //RetryRule() 先轮询,如果服务失败,然后在指定时间内进行重试,获取可用服务
  16. //BestAvailableRule()先过滤掉由于多次访问故障而处于断路或者跳闸的服务,然后选择一个并发量小的服务
  17. return new RandomRule();
  18. }
  19. }

DeptController_Consumer.java

  1. package com.wuk.controller;
  2. import java.util.List;
  3. import org.springframework.beans.factory.annotation.Autowired;
  4. import org.springframework.web.bind.annotation.PathVariable;
  5. import org.springframework.web.bind.annotation.RequestMapping;
  6. import org.springframework.web.bind.annotation.RestController;
  7. import org.springframework.web.client.RestTemplate;
  8. import com.wuk.entity.Dept;
  9. @RestController
  10. public class DeptController_Consumer {
  11. //之前我们采用的是ip+端口,现在直接采用服务名
  12. private static final String REST_URL_PREFIX = "http://producers";
  13. @Autowired
  14. private RestTemplate restTemplate;
  15. @RequestMapping(value = "/consumer/dept/add")
  16. public boolean add(Dept dept) {
  17. return restTemplate.postForObject(REST_URL_PREFIX + "/dept/add", dept, Boolean.class);
  18. }
  19. @RequestMapping(value = "/consumer/dept/get/{id}")
  20. public Dept get(@PathVariable("id") Long id) {
  21. return restTemplate.getForObject(REST_URL_PREFIX + "/dept/get/" + id, Dept.class);
  22. }
  23. @SuppressWarnings("unchecked")
  24. @RequestMapping(value = "/consumer/dept/list")
  25. public List<Dept> list() {
  26. return restTemplate.getForObject(REST_URL_PREFIX + "/dept/list", List.class);
  27. }
  28. }

CusumerDeptApplication.java

  1. package com.wuk;
  2. import org.springframework.boot.SpringApplication;
  3. import org.springframework.boot.autoconfigure.SpringBootApplication;
  4. import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
  5. @SpringBootApplication
  6. @EnableEurekaClient
  7. public class CusumerDeptApplication {
  8. public static void main(String[] args) {
  9. SpringApplication.run(CusumerDeptApplication.class, args);
  10. }
  11. }

发表评论

表情:
评论列表 (有 0 条评论,257人围观)

还没有评论,来说两句吧...

相关阅读

    相关 .Net微服务负载均衡2

    ![8c552560cf634148acba03c0eaad0ad4.webp][] API网关层是微服务架构中的一个重要组成部分。它是一个软件,可以作为反向代理,将客户端的

    相关 gRPC服务发现&负载均衡

    1. 构建高可用服务 构建高可用、高性能的通信服务,通常采用服务注册与发现、负载均衡和容错处理等机制实现。根据负载均衡实现所在的位置不同,通常可分为以下三种解决方案: