Spring cloud alibaba ribbon配置方式

81 阅读3分钟

1.前置准备

已经搭建起nacos 服务注册中心

有一个订单Order(order-service) 服务,两个库存Stock(stock-service) 服务

目录结构如下:

image.png

2.order-server 和 stock-service的依赖和属性配置文件

在最外侧的pom也就是sample-spring-cloud-alibaba-ribbon\pom.xml中导入依赖管理配置

<dependencyManagement>  
    <dependencies>  
        <dependency>  
            <groupId>org.springframework.boot</groupId>  
            <artifactId>spring-boot-starter-parent</artifactId>  
            <version>2.3.2.RELEASE</version>  
            <type>pom</type>  
            <scope>import</scope>  
        </dependency>  
        <dependency>  
            <groupId>com.alibaba.cloud</groupId>  
            <artifactId>spring-cloud-alibaba-dependencies</artifactId>  
            <version>2.2.5.RELEASE</version>  
            <type>pom</type>  
            <scope>import</scope>  
        </dependency>  
        <dependency>  
            <groupId>org.springframework.cloud</groupId>  
            <artifactId>spring-cloud-dependencies</artifactId>  
            <version>Hoxton.SR8</version>  
            <type>pom</type>  
            <scope>import</scope>  
        </dependency>  
    </dependencies>  
</dependencyManagement>

然后在order-service 和 stock-service的 pom.xml中加入以下依赖

<dependencies>  
    <dependency>  
        <groupId>org.springframework.boot</groupId>  
        <artifactId>spring-boot-starter</artifactId>  
    </dependency>  
    <dependency>  
        <groupId>org.springframework.boot</groupId>  
        <artifactId>spring-boot-starter-web</artifactId>  
    </dependency>  
  
    <dependency>  
        <groupId>com.alibaba.cloud</groupId>  
        <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>  
    </dependency>  
</dependencies>

由于在外侧的pom.xml中已经带入了依赖管理,所以这个位置的版本号可以省略,其中spring-boot-starter,spring-boot-starter-web的版本号由spring-boot-starter-parent提供,spring-cloud-starter-alibaba-nacos-discovery的版本由spring-cloud-alibaba-dependencies提供。

       其中spring-cloud-starter-netflix-ribbon 会包含在spring-cloud-starter-alibaba-nacos-discovery中,不需要额外导入。

其中order-service 的application.properties内容如下

server.port=8080  
#你的服务名称  
spring.application.name=order-service  
#nacos的配置  
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848  
spring.cloud.nacos.discovery.username=nacos  
spring.cloud.nacos.discovery.password=nacos  
spring.cloud.nacos.discovery.namespace=public

stock-service 的application.properties内容如下

server.port=8091  
#你的服务名称 
spring.application.name=stock-service  
#nacos的相关配置  
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848  
spring.cloud.nacos.discovery.username=nacos  
spring.cloud.nacos.discovery.password=nacos  
spring.cloud.nacos.discovery.namespace=public  
spring.cloud.nacos.discovery.ephemeral=false

3.RestTemplate开启负载均衡

创建CustomConfiguration类,用于定义RestTemplate,同时加入LoadBalanced

开启负载均衡功能

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

后续如果使用openFeign进行服务调用的话,则不需要这么麻烦,ribbon会被整合,同时也不需要使用restTemplate

4.使用RestTemplate发起服务请求

在stock-service 中,开发测试用的controller 方法

@RestController  
@RequestMapping("/stock")  
public class StockRestController {  
  
    @Value("${server.port}")  
    private String port;  
  
    @GetMapping("/submit")  
    public String submit() {  
        return "去庫存成功 : " + port;  
    }  
}

在order-service中,开发测试用的controller 方法

@RestController  
@RequestMapping("/order")  
public class OrderRestController {  
  
    @Autowired  
    private RestTemplate restTemplate;  
  
    @GetMapping("/submit")  
    public String submit() {  
        ResponseEntity<String> stringResponseEntity = restTemplate.getForEntity("http://stock-service/stock/submit", String.class);  
        return "下單成功 " + stringResponseEntity.getBody();  
    }  
}

此时目录结果如下:

image.png

以上代码使用restTemplate 发起了一次请求,会从服务注册中心获取所有可用的stock-service服务,并按照配置好的默认策略(ZoneAvoidanceRule)进行负载均衡。

由于测试负载均衡需要使用两个stock-service,我这边使用的开发工具是idea,可以复制多一个启动配置,并更改端口 image.png

在浏览器输入http://127.0.0.1:8080/order/submit 后,就能看到返回的信息在8091和8092之间不断转换

image.png

image.png

5.修改负载均衡的规则

修改的方法有两种

第一种,在order-service 添加一个新的配置类RibbonConfiguration

@Configuration  
public class RibbonConfiguration {  
  
    @Bean  
    public IRule ribbonRule() {  
        return new RandomRule();  
    }  
}

注意,假如该配置类能够被spring boot 的包所扫描,那么这个策略将会被应用到所有的服务调用上。

如果你只需要该策略生效在某一个服务调用上,需要将RibbonConfiguration放到不能被spring boot 所能扫描,或者在包扫描配置的地方排除该类,然后再需要生效的服务即可

@SpringBootApplication  
@RibbonClients(value = {  
        @RibbonClient(name = "stock-service", configuration = RibbonConfiguration.class)  
})  
public class OrderServiceApplication {  
  
    public static void main(String[] args) {  
        SpringApplication.*run*(OrderServiceApplication.class, args);  
    }  
}

第二种方法,直接在配置文件修改,推荐使用该方法,比较方便

stock-service.ribbon.NFLoadBalancerRuleClassName=com.alibaba.cloud.nacos.ribbon.NacosRule

其中stock-service是你希望该规则生效的服务名