• Spring Cloud Ribbon+RestTemplate 实现服务负载均衡调用


    简介

    在微服务架构中,业务都会被拆分成一个独立的服务,服务与服务的通讯是基于 Http Restful 的。Spring Cloud 有两种服务调用方式,一种是 Ribbon + RestTemplate ,另一种是 Feign

    Ribbon 是一个负载均衡客户端,可以很好的控制 HTTP 和 TCP 的一些行为。

    引入依赖

    pom.xml 中主要添加 spring-cloud-starter-netflix-eureka-serverspring-cloud-starter-netflix-ribbon 依赖

    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
    </dependency>
    
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
    </dependency>
    

    相关配置

    application.yml 中添加以下配置

    spring:
      application:
        name: hello-spring-cloud-web-admin-ribbon
      thymeleaf:
        cache: false
        mode: LEGACYHTML5
        encoding: UTF-8
        servlet:
          content-type: text/html
    
    server:
      port: 8764
    
    eureka:
      client:
        serviceUrl:
          defaultZone: http://localhost:8761/eureka/
    

    Application 入口类中通过添加 @EnableDiscoveryClient 注解开启发现服务功能

    @SpringBootApplication
    @EnableDiscoveryClient
    public class WebAdminRibbonApplication {
        public static void main(String[] args) {
            SpringApplication.run(WebAdminRibbonApplication.class, args);
        }
    }
    

    创建 RestTemplateConfiguration 配置类,该类用于注入 RestTemplate,并通过 @LoadBalanced 注解表明开启负载均衡功能

    @Configuration
    public class RestTemplateConfiguration {
    
        @Bean
        @LoadBalanced
        public RestTemplate restTemplate() {
            return new RestTemplate();
        }
    }
    

    Service

    在这里我们直接用的程序名替代了具体的 URL 地址,在 Ribbon 中它会根据服务名来选择具体的服务实例,根据服务实例在请求的时候会用具体的 URL 替换掉服务名,代码如下:

    @Service
    public class AdminService {
    
        @Autowired
        private RestTemplate restTemplate;
    
        public String sayHi(String message) {
            return restTemplate.getForObject("http://hello-spring-cloud-service-admin/hi?message=" + message, String.class);
        }
    }
    

    Controller

    创建 Controller 对外提供调用的服务

    @RestController
    public class AdminController {
    
        @Autowired
        private AdminService adminService;
    
        @RequestMapping(value = "hi", method = RequestMethod.GET)
        public String sayHi(@RequestParam String message) {
            return adminService.sayHi(message);
        }
    }
    
  • 相关阅读:
    [2011Summary Weekly]March.28April.1
    如何对需求分析人员进行考核测试角度
    算法实现三角形式输出C(n,k)
    Scrum 培训系列Scrum on a Page
    [练习]solveMaze
    excel中如何统计条件筛选后的条数
    开发人员绩效考核中"有效"bug数的统计
    Scrum 培训系列Scrum Lifecycle
    IIS6.0日志文件自定义类代码
    IIS6.0日志文件分析代码_3线程读取文件到数据库
  • 原文地址:https://www.cnblogs.com/antoniopeng/p/12687570.html
Copyright © 2020-2023  润新知