写死url
@GetMapping("/server/get")
public String server() {
return "Hello,I am Server";
}
client端
@GetMapping("/client/get")
public String client() {
RestTemplate restTemplate = new RestTemplate();
String result = restTemplate.getForObject("http://localhost:8080/server/get", String.class);
log.info("接收到的数据是:{}", result);
return result;
}
缺点
需要制定server的地址,在不知道server地址的情况下很鸡肋
服务器跟第一种方式一致不变
客户端 使用LocaBalancerClient来获取注册中心中指定应用名称服务的url
@Autowired
private LoadBalancerClient loadBalancerClient;
@GetMapping("/client/get")
public String client() {
RestTemplate restTemplate = new RestTemplate();
ServiceInstance serviceInstance = loadBalancerClient.choose("PRODUCT");
String url = String.format("http://%s:%s", serviceInstance.getHost(), serviceInstance.getPort() + "/server/get");
String result = restTemplate.getForObject(url, String.class);
return result;
}
服务端不变
和第二种方式类似,只是把他抽离成一个Bean可以注入进来,主要是@LoadBalanced这个注解
客户端
@Component
public class RestTemplateConfig {
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
@Autowired
private RestTemplate restTemplate;
@GetMapping("/client/get")
public String client() {
String result = restTemplate.getForObject("http://PRODUCT/server/get", String.class);
return result;
}
结果都是一致的
以上三种方法其实主要都是用到RestTemplate,此外这里会涉及到负载均衡,根据请求对象的数量springcloud会使用他自己的默认策略,随机、轮询等。
eureka是属于客户端发现,他的负载均衡是软负载。客户端会向服务器。
如eureka向服务器拉去以注册可用的服务信息,根据负载均衡策略直接命中某一台服务器发送请求,这些都是在客户端完成的,并不需要服务器的参与。
负载均衡器组件是:Ribbon
面向服务器的Rest服务请求,自动转化成客户端负载均衡服务调用
实现负载均衡的核心有三点:
主要组件:
更改Ribbon负载均衡策略
在配置中添加:
PRODUCT(应用名称):
ribbon:
NFLocaBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
要把策略的包名也带上,一下就是策略中的一些策略
先说一下怎么用
在客户端引入Fegin依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
<version>2.1.1.RELEASE</version>
</dependency>
在启动类上加注解:@EnableFeignClients
定义一个去请求某个应用接口的类
@FeignClient(name = “PRODUCT”) 就是你要去请求的某个应用的名称
@FeignClient(name = "PRODUCT")
public interface ProductClient {
@GetMapping("/server/get")
String serverGet();
}
在controller中注入进来
@Autowired
private ProductClient productClient;
@GetMapping("/fegin/get")
public String feginGet() {
return productClient.serverGet();
}
就这样运行访问这个接口就可以拿到数据了
Fegin简单说明:
本质上还是HTTP客户端,内部也是Ribbon作为负载均衡器