一。RestTemplate的方式
1.url写死的方式
RestTemplate restTemplate = new RestTemplate();
String msg = restTemplate.getForObject("http://localhost:8080/server/msg" , String.class);
该方式发送get请求,指定返回类型即可。
2.通过服务名的方式动态调用服务
在使用类上面注入LoadBalancerClient 类
@Autowired
private LoadBalancerClient loadBalancerClient;
RestTemplate restTemplate = new RestTemplate();
ServiceInstance serviceInstance = loadBalancerClient.choose("PRODUCT"); //PRODUCT为注册到中心的服务名
String url = String.format("http://%s:%s" , serviceInstance.getHost() , serviceInstance.getPort()) + "/server/msg";
String msg = restTemplate.getForObject(url , String.class);
该方式可以实现负载均衡的去调用product服务。
3.通过注解的方式动态调用服务
声明一个bean如下:
@Component
public class RestTemplateConfig {
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
在使用的地方将其注入,并通过服务名动态调用相关服务
String msg = restTemplate.getForObject("http://PRODUCT/server/msg" , String.class);
该方式和第2种方式一样,也能实现负载均衡的效果。
二。通过feign的方式调用
1.引入依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
springcloud低版本2.0.0以下请使用如下依赖:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-feign</artifactId>
</dependency>
2.声明服务调用客户端类
@FeignClient(name = "目标服务名称")
@Component
public interface ServiceClient {
//对外暴露的API
@PostMapping("/xxxx/xxx")
List<ProductInfoOutput> list(@RequestBody List<String> productIdList);
}
@EnableFeignClients(basePackages = "com.gzcstec.product.client")
注意如果是ServiceClient类是其他服务打包提供的,需要在basePackages配置ServiceClient类的路径
使用非常方便,只需将ServiceClient注入到使用的地方,则直接使用service方式进行调用即可。该种方式也实现负载均衡的效果,需要注意的是如果是提供服务方通过直接打包的方式对外提供服务的,则服务消费方直接使用服务方的feign依赖即可,无需再次引入feign依赖,防止版本不一致导致调用失败。