使用ribbon之前的准備工作:
1.你要有兩個服務,一個是服務消費方(下圖的xing-movie是消費方),一個是服務提供方(xing-user是服務提供者),並且服務提供方要有兩個實例,也就是xing-user有兩個實例,分別運行在8070和8071端口。
2.所有服務注冊到eureka server中。
接下來我們在movie服務使用ribbon實現負載均衡調用中調用user服務,spring cloud使用ribbon很簡單
1.引入依賴,因為user服務的pom.xml中引入了eureka的依賴,eureka的依賴包含了ribbon的依賴所以這一步省略
2.在movie服務的啟動類中加入標紅的代碼,加入是為了在之后調用的時候可以直接@Autowired restTemplate,順便提醒一下,@Autowired是 byType的,不是byName:
package com.xing.movie; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.loadbalancer.LoadBalanced; import org.springframework.cloud.netflix.eureka.EnableEurekaClient; import org.springframework.context.annotation.Bean; import org.springframework.web.client.RestTemplate; @SpringBootApplication @EnableEurekaClient public class SpringDemoApplication { @Bean @LoadBalanced public RestTemplate restTemplate() { return new RestTemplate(); } public static void main(String[] args) { SpringApplication.run(SpringDemoApplication.class, args); } }
啟動類寫好之后我們去controller類中寫調用user服務的方法:
@Autowired
private RestTemplate restTemplate;
@ApiOperation(value = "查詢用戶", notes = "查詢用戶")//方法說明 @ApiResponses(value = {@ApiResponse(code = 200, message = "成功", response = Movie.class)})//響應數據說明,可以有多個 @ApiImplicitParam(name = "name", value = "用戶名", paramType = "path", required = true, dataType = "String") @GetMapping(value = "/findUerByName/{name}",produces = { "application/json;charset=UTF-8" }) public User findUserByName(@PathVariable String name) { return this.restTemplate.getForObject("http://xing-user/user/findByName/"+name, User.class); }
標紅的地方要注意使用的是user服務的spring.application.name,這里使用到的user服務在上一篇博客中有具體的代碼,最后一行代碼中的User.class是返回類型,如果報錯那就去user服務中把User類拷貝過來,到目前為止ribbon的簡答的負載均衡就搞定了,查看結果
可以看到已經成功的調用到了user服務,並返回了數據,這個時候我們只能說服務調用成功並不能說負載均衡。這個網頁我們多刷新幾遍,多做幾次請求,之后去查看后台數據會發現user1中的控制台打印了數據,user2的控制台也打印了數據,說明負載均衡成功。
簡單提一下spring cloud中ribbon的負載均衡算法默認是輪詢。那么我們不想使用輪詢怎么自定義呢?
我們首先需要創建一個class,根據官方文檔這個類必須在啟動類能掃描的范圍之外,所以這個class定義的位置如下:
RibbonConfig.java:

package com.xing.config; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import com.netflix.client.config.IClientConfig; import com.netflix.loadbalancer.IRule; import com.netflix.loadbalancer.RandomRule; /** * Copyright: Copyright (c) 2018 LanRu-Caifu * @ClassName: RibbonConfig.java * @Description: 自定義ribbon配置類 * @version: v1.0.0 * @author: zjx * @date: 2018年11月2日 上午10:08:36 */ @Configuration public class RibbonConfig { @Autowired IClientConfig config; @Bean @ConditionalOnMissingBean public IRule ribbonRule(IClientConfig config) { System.out.println("-------ribbon自定義隨機------"); return new RandomRule(); } }
movie服務的啟動類修改之后如下:

package com.xing.movie; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.loadbalancer.LoadBalanced; import org.springframework.cloud.netflix.eureka.EnableEurekaClient; import org.springframework.cloud.netflix.ribbon.RibbonClient; import org.springframework.context.annotation.Bean; import org.springframework.web.client.RestTemplate; import com.xing.config.RibbonConfig; @SpringBootApplication @EnableEurekaClient @RibbonClient(name = "xing-user" , configuration = RibbonConfig.class) public class SpringDemoApplication { @Bean @LoadBalanced public RestTemplate restTemplate() { return new RestTemplate(); } public static void main(String[] args) { SpringApplication.run(SpringDemoApplication.class, args); } }
最后啟動類測試,做了4次請求,user1打印了3次,user2打印了1次
還有其他的很多種配置方式,這里只簡單寫出這種,以后有空還會補充配置文件的方式等等
源碼地址:https://github.com/OnlyXingxing/SpringCloud