客戶端客戶端負(fù)載均衡使用
spring could在客戶端負(fù)載均衡有兩種選擇一種是ribbon+restTemplate喇闸,另一種是feign碴巾。本主要講解下基于ribbon+rest著隆。當(dāng)然feign(Feign默認(rèn)集成了ribbon)也會(huì)簡(jiǎn)單介紹绍申。
- ribbon+restTemplate實(shí)現(xiàn)方式
首先需要在項(xiàng)目中添加pom文件中添加依賴
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>
- 在工程的配置文件指定服務(wù)的注冊(cè)中心地址為同上節(jié)eureka client配置相同 衙耕,例如:
eureka:
client:
serviceUrl:
defaultZone: http://localhost:8761/eureka/
server:
port: 8764
spring:
application:
name: service-ribbon
- 在工程的啟動(dòng)類中,通過(guò)@EnableDiscoveryClient向服務(wù)中心注冊(cè)弄慰;并且向程序的ioc注入一個(gè)bean: restTemplate;并通過(guò)@LoadBalanced注解表明restRemplate開(kāi)啟負(fù)載均衡的功能。
例如在api-server項(xiàng)目啟動(dòng)類如下
@SpringBootApplication
@EnableEurekaClient
@EnableCircuitBreaker
@EnableResourceServer
@Configuration
@ComponentScan({"com.packtpub.mmj.api.service", "com.packtpub.mmj.common"})
public class ApiApp {
//................................省略
@LoadBalanced
@Bean
RestTemplate restTemplate() {
return new RestTemplate();
}
public static void main(String[] args) {
LOG.info("Register MDCHystrixConcurrencyStrategy");
HystrixPlugins.getInstance().registerConcurrencyStrategy(new MDCHystrixConcurrencyStrategy());
SpringApplication.run(ApiApp.class, args);
}
}
- 在使用restTemplate向其他服務(wù)發(fā)送請(qǐng)求就會(huì)通過(guò)eureka server 通過(guò)負(fù)載策略代理到相應(yīng)的服務(wù)上首尼。
- 注意:ribbon中會(huì)根據(jù)服務(wù)名來(lái)選擇具體的服務(wù)實(shí)例挑庶,根據(jù)服務(wù)實(shí)例在請(qǐng)求的時(shí)候會(huì)用具體的url替換掉服務(wù)名。所以使用的url要用服務(wù)名稱而不是IP:port這種形式
比如下例子:
@Autowired
RestTemplate restTemplate;
public String hiService(String name) {
return restTemplate.getForObject("http://SERVICE-HI/hi?name="+name,String.class);
}
- Feign是一個(gè)聲明式的偽Http客戶端软能,使用Feign迎捺,只需要?jiǎng)?chuàng)建一個(gè)接口并注解。Feign支持可插拔的編碼器和解碼器查排。Feign默認(rèn)集成了Ribbon凳枝,并和Eureka結(jié)合,默認(rèn)實(shí)現(xiàn)了負(fù)載均衡雹嗦。
- 使用的第一步添加依賴
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
- 第二步 工程配置application.yml范舀,和上述ribbon相同 略
- 第三步 啟動(dòng)類加上@EnableFeignClients注解開(kāi)啟Feign的功能,例如:
@SpringBootApplication
@EnableEurekaClient
@EnableDiscoveryClient
@EnableFeignClients
public class AppService{
public static void main(String[] args) {
SpringApplication.run( AppService.class, args );
}
}
- 第四步 使用
只需要定義一個(gè)接口合是,通過(guò)@ FeignClient(“服務(wù)名”),來(lái)指定調(diào)用哪個(gè)服務(wù)锭环。比如在代碼中調(diào)用了restaurant-service服務(wù)的“/v1/restaurants”聪全,(spring 會(huì)替我們實(shí)現(xiàn)有@ FeignClient的接口)代碼如下:
//定義
@FeignClient("restaurant-service")
interface RestaurantClient {
@RequestMapping(method = RequestMethod.GET, value = "/v1/restaurants")
Collection<Restaurant> getRestaurants(@RequestParam("name") String name);
}
//使用
@Autowired
private RestaurantClient restaurantClient;
// 調(diào)用即可
總結(jié): 上述兩種方式均為客戶端服務(wù)在調(diào)用,其他服務(wù)的請(qǐng)求會(huì)先通過(guò)eureka server查找已注冊(cè)的服務(wù)根據(jù)相應(yīng)的負(fù)載策略辅辩,轉(zhuǎn)到具體的服務(wù)