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,支持權重的負載均衡算法
- 自定義權重算法
創建一個類,繼承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;
}
}
}
- 在啟動類上啟用
- 創建一個子模塊和goods一樣 更改端口號
啟動所有服務 - 在nacos服務中心當中配置服務的權重
Spring-Clould-Alibaba-集成Feign
使用步驟
1. 在客戶端引入依賴 user
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
2. 在啟動類上面加上注解:@EnableFeignClients
創建服務FeignClient
- 創建一個service文件夾,在該文件下創建一個接口,在接口加上添加@FeignClient()注解 參數就是你的微服務名字
@FeignClient(name="goods-provide")
public interface FeiginClient {
@RequestMapping("/getGoods")
public Object getGoods();
}
- 在控制器中注入,並調用
@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);
}
- 在FeiginClient編寫接口
@RequestMapping("/getGoodsWithID/{id}")
public ResponseResult getGoodsWithID(@PathVariable Integer id);
- 在controller中調用
@RequestMapping("/getGoodsWithID/{id}")
public ResponseResult getGoodsWithID(@PathVariable Integer id){
return ResponseResult.success("操作成功",
feiginClient.getGoodsWithID(id));
}
啟動測試
4. 多個參數請求
- 創建一個子工程 放實體類
- 創建實體類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;
}
}
- 在其他工程依賴實體包
<dependency>
<groupId>com.dj</groupId>
<artifactId>GoodsPojo</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
- 在goods工程的controller中創建帶多個參數的方法
- 在FeiginClient中創建接口 注意寫上@SpringQueryMap注解,否則傳值接收不到
- 在controller中調用
@RequestMapping("/getGoodsWithObj")
public ResponseResult getGoodsWithObj(Goods goods){
return ResponseResult.success("操作成功",
feiginClient.getGoodsWithObj(goods));
}
啟動測試