一、LoadBalancerClient
是一个负载均衡客户端的抽象定义,可以实现服务的消费接口
消费者在应用主类里初始化RestTemplate
@SpringBootApplication
@EnableEurekaClient
public class DemoApplication {
@Bean
public RestTemplate restTemplate(){
return new RestTemplate();
}
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
创建接口来消费服务者提供的接口
@RestController
public class UserController {
@Autowired
LoadBalancerClient loadBalancerClient;
@Autowired
RestTemplate restTemplate;
// Dalston
@RequestMapping("/consumer2")
public String dc2(){
//根据要消费服务的名称,获取服务提供者相关信息
ServiceInstance serviceInstance = loadBalancerClient.choose("client");
//访问服务提供者url
String url = "http://" + serviceInstance.getHost() + ":" + serviceInstance.getPort() + "/dc2";
return restTemplate.getForObject(url, String.class);
}
}
服务提供者
@RestController
public class LoginController {
@RequestMapping("dc2")
public String dc2(){
System.out.println("进入dc4方法!!!");
return "123";
}
}
访问消费者:端口号/consumer2
/consumer2—>/dc2 返回结果为123
二、RestTemplate + Spring Cloud Ribbon
Spring Cloud Ribbon是基于Netflix Ribbon实现的一套客户端负载均衡的工具
是一个基于HTTP和TCP的客户端负载均衡器
可以在客户端配置 ribbonServerList(服务端列表),然后轮询请求以实现均衡负载
pom.xml中加入
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-ribbon</artifactId>
</dependency>
修改应用主类:为RestTemplate增加@LoadBalanced注解
创建接口来消费服务者提供的接口,直接根据服务名访问,不用根据ip port
@RestController
public class UserController {
@Autowired
RestTemplate restTemplate;
// Ribbon
@RequestMapping("/consumer3")
public String dc3() {
return restTemplate.getForObject("http://client/dc2", String.class);
}
访问/conusmer3结果同上
三、Spring Cloud Feign
Spring Cloud Feign是一套基于Netflix Feign实现的声明式服务调用客户端。它使得编写Web服务客户端变得更加简单。
是一个使用起来更加方便的 HTTP 客戶端,使用起来就像是调用自身工程的方法,而感觉不到是调用远程方法。
pom.xml中加入
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-feign</artifactId>
</dependency>
在应用主类中加入@EnableFeignClients注解
@SpringBootApplication
@EnableEurekaClient
@EnableFeignClients
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
dcClient.java接口
@FeignClient(value = "client",path = "/") //指定接口所要调用的服务名称
public interface DcClient {
@RequestMapping(value = "dc4",method = RequestMethod.POST)
String consumer();
}
消费者创建接口来消费服务者提供的接口
@RestController
public class UserController {
//FeignClient
@Autowired
DcClient dcClient;
@RequestMapping("consumer4")
public String dc4(){
return dcClient.consumer();
}
}
访问/conusmer4结果同上
我们在项目中使用的是第三种,feign本身里面就包含有了ribbon,是一个声明式的伪http客户端,是一个采用基于接口的注解的编程方式,更加简便