Spring-Clould-Alibaba-集成Ribbon&Feign


Spring-Clould-Alibaba-集成Ribbon

1. RestTemplate上添加注解@LoadBalanced

在這里插入圖片描述

2. 在調用時, 就可以使用服務名稱來進行調用 , 和之前的使用Eureka方式 是一樣的

默認使用是輪詢策略
在這里插入圖片描述

@RequestMapping("/getGoods")
    public ResponseResult getGoods() {
        String url="http://goods-provide/getGoods";
        return ResponseResult.success("操作成功",
                restTemplate.getForObject(url,Object.class));
    }

3. 自定義負載均衡策略

在啟動類上添加
在這里插入圖片描述

@Bean
    public IRule Irule(){
        return new RandomRule();//隨機負載均衡
    }

4. 配置懶加載

在這里插入圖片描述

# 飢餓加載(懶加載) 已啟動就獲取服務
ribbon:
  eager-load:
    enabled: true
    clients: goods-provide #多個服務使用逗號隔開

5. Nacos集成Ribbon,支持權重的負載均衡算法

  1. 自定義權重算法
    創建一個類,繼承AbstractLoadBalancerRule類 實現如下方法
    在這里插入圖片描述
public class IRuleConfig  extends AbstractLoadBalancerRule {
    @Autowired
    private NacosDiscoveryProperties nacosDiscoveryProperties;
    @Override
    public void initWithNiwsConfig(IClientConfig iClientConfig) {

    }
    @Override
    public Server choose(Object key) {
        try {
            BaseLoadBalancer loadBalancer = (BaseLoadBalancer)this.getLoadBalancer();
            //獲取請求微服務的名稱
            String name = loadBalancer.getName();
            //獲取nacos服務發現相關名稱
            NamingService namingService = nacosDiscoveryProperties.namingServiceInstance();
            //nacos client自動通過基於權重的負載均衡算法,選擇實例
            Instance instance = namingService.selectOneHealthyInstance(name);
            System.out.println("端口:"+instance.getPort()+"實例:"+instance);
            return new NacosServer(instance);
        } catch (NacosException e) {
            e.printStackTrace();
            return null;
        }
    }
}
  1. 在啟動類上啟用
    在這里插入圖片描述
  2. 創建一個子模塊和goods一樣 更改端口號
    在這里插入圖片描述
    在這里插入圖片描述
    啟動所有服務
  3. 在nacos服務中心當中配置服務的權重
    在這里插入圖片描述
    在這里插入圖片描述

Spring-Clould-Alibaba-集成Feign

使用步驟

1. 在客戶端引入依賴 user

在這里插入圖片描述

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

2. 在啟動類上面加上注解:@EnableFeignClients

在這里插入圖片描述

創建服務FeignClient

  1. 創建一個service文件夾,在該文件下創建一個接口,在接口加上添加@FeignClient()注解 參數就是你的微服務名字
    在這里插入圖片描述
@FeignClient(name="goods-provide")
public interface FeiginClient {

    @RequestMapping("/getGoods")
    public Object getGoods();
}

  1. 在控制器中注入,並調用
    在這里插入圖片描述
 @Autowired
    private FeiginClient feiginClient;
 @RequestMapping("/getGoods")
    public ResponseResult getGoods() {

        return ResponseResult.success("操作成功",
                feiginClient.getGoods());
    }

啟動測試
在這里插入圖片描述

3.單個參數請求

1.在goods中 編寫帶參數的請求

在這里插入圖片描述

 @RequestMapping("/getGoodsWithID/{id}")
    public ResponseResult getGoodsWithID(@PathVariable Integer id){
        return ResponseResult.success("id="+id);
    }
  1. 在FeiginClient編寫接口 在這里插入圖片描述
@RequestMapping("/getGoodsWithID/{id}")
    public ResponseResult getGoodsWithID(@PathVariable Integer id);
  1. 在controller中調用
    在這里插入圖片描述
 @RequestMapping("/getGoodsWithID/{id}")
    public ResponseResult getGoodsWithID(@PathVariable Integer id){
        return ResponseResult.success("操作成功",
                feiginClient.getGoodsWithID(id));
    }

啟動測試
在這里插入圖片描述

4. 多個參數請求

  1. 創建一個子工程 放實體類
    在這里插入圖片描述
  2. 創建實體類Goods 實現序列化接口和get set方法
    在這里插入圖片描述
public class Goods implements Serializable {
    private String name;
    private String color;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getColor() {
        return color;
    }

    public void setColor(String color) {
        this.color = color;
    }
}
  1. 在其他工程依賴實體包
    在這里插入圖片描述
<dependency>
            <groupId>com.dj</groupId>
            <artifactId>GoodsPojo</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
  1. 在goods工程的controller中創建帶多個參數的方法
    在這里插入圖片描述
  2. 在FeiginClient中創建接口 注意寫上@SpringQueryMap注解,否則傳值接收不到
    在這里插入圖片描述
  3. 在controller中調用
    在這里插入圖片描述
@RequestMapping("/getGoodsWithObj")
    public ResponseResult getGoodsWithObj(Goods goods){
        return ResponseResult.success("操作成功",
                feiginClient.getGoodsWithObj(goods));
    }
    

啟動測試
在這里插入圖片描述


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM