### SpringCloud中服务间两种resultful调用方式
ResultTemplate
Feign
从上一节可以看到订单服务需要调用商品服务
下面我来简单的说一下ResultTemplate以及Feign
1.ResultTemplate的三种调用方式
上一节商品服务以及订单服务分别在两个不同的系统
在商品服务中
/**
* 商品服务端
* Created by ZhuPengWei on 2018/5/11.
*/
@RestController
public class ServerController {
@GetMapping("/msg")
public String setMsg() {
return "this is product msg";
}
}
在订单服务中怎么去调用或者接受商品服务的消息呢?
1.下面是关于RestTemplate的三种调用方式
/**
* 客户端
* Created by ZhuPengWei on 2018/5/11.
*/
@RestController
@Slf4j
public class ClientController {
/**
* ResultTemplate第一种调用方式
* 缺点:url是写死的 多个访问地址对于这个方法是一个大考验
*
* @return
*/
@GetMapping("/getProductMsg1")
public String getProductMsg1() {
RestTemplate restTemplate = new RestTemplate();
String result = restTemplate.getForObject("http://localhost:8080/msg", String.class);
log.info("返回结果:{}", result);
return result;
}
@Autowired
private LoadBalancerClient loadBalancerClient;
/**
* 第二种方式
* 使用 LoadBalancerClient 通过应用名获取url 然后在使用RestTemplate
*
* @return
*/
@GetMapping("/getProductMsg2")
public String getProductMsg2() {
ServiceInstance serviceInstance = loadBalancerClient.choose("PRODUCT");
String url = String.format("http://%s:%s", serviceInstance.getHost(), serviceInstance.getPort()) + "/msg";
RestTemplate restTemplate = new RestTemplate();
String result = restTemplate.getForObject(url, String.class);
log.info("返回结果:{}", result);
return result;
}
@Autowired
private RestTemplate restTemplate;
/**
* 第三种方式
* 使用注解
*
* @return
*/
@GetMapping("/getProductMsg3")
public String getProductMsg3() {
return restTemplate.getForObject("http://PRODUCT/msg", String.class);
}
}
第三种方式的配置
@Component
public class RestTemplateConfig {
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
2.负载均衡器Ribbon
SpringCloud是客户端发现中间的负载均衡器是Ribbon
其中RestTimeplate, Feign ,zuul都是通过Ribbon实现负载均衡的
也可以通过spring.io官网上的SpringCloud项目查找Ribbon自定义负载均衡的策略(默认轮询)
扫描二维码关注公众号,回复:
2731081 查看本文章
# users是应用的名字
users:
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.WeightedResponseTimeRule
可以通过IRule查找实现类名来自定义负载均衡策略
2.Feign
配置pom文件中引入
<!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-feign -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-feign</artifactId>
</dependency>
启动类
@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
public class OrderApplication {
public static void main(String[] args) {
SpringApplication.run(OrderApplication.class, args);
}
}
定义好使用的接口
package pers.zpw.oder.controller;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.loadbalancer.LoadBalancerClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
import pers.zpw.oder.client.ProductClient;
/**
* 客户端
* Created by ZhuPengWei on 2018/5/11.
*/
@RestController
@Slf4j
public class ClientController {
@Autowired
private ProductClient productClient;
/**
* 通过feign调用
*
* @return
*/
@GetMapping("/getProductMsg4")
public String getProductMsg4() {
return productClient.msg();
}
}
Feign调用步骤:
1.引入pom
2.启动类加入注解
3.声明需要调用的接口