使用RestTemplate开发服务消费者

概念阐述

RestTemplate是Spring提供的RESTful访问接口,ServiceComb提供该接口的实现类用于服务的调用。

场景描述

用户使用ServiceComb提供的RestTemplate实例,可以使用自定义的URL进行服务调用,而不用关心服务的具体地址。

示例代码

RestTemplate实例通过调用RestTemplateBuilder.create()方法获取,再使用该实例通过自定义的URL进行服务调用,代码如下:

  • Spring MVC 客户端示例代码:
  1. @Component
  2. public class SpringmvcConsumerMain {
  3. private static RestTemplate restTemplate = RestTemplateBuilder.create();
  4. public static void main(String[] args) throws Exception {
  5. init();
  6. Person person = new Person();
  7. person.setName("ServiceComb/Java Chassis");
  8. String sayHiResult = restTemplate
  9. .postForObject("cse://springmvc/springmvchello/sayhi?name=Java Chassis", null, String.class);
  10. String sayHelloResult = restTemplate
  11. .postForObject("cse://springmvc/springmvchello/sayhello", person, String.class);
  12. System.out.println("RestTemplate consumer sayhi services: " + sayHiResult);
  13. System.out.println("RestTemplate consumer sayhello services: " + sayHelloResult);
  14. }
  15. public static void init() throws Exception {
  16. Log4jUtils.init();
  17. BeanUtils.init();
  18. }
  19. }
  • JAX RS 客户端示例代码:
  1. @Component
  2. public class JaxrsConsumerMain {
  3. public static void main(String[] args) throws Exception {
  4. init();
  5. //其他都类似spring MVC示例的客户端代码,注意如果服务端只接收 GET 请求,要使用方法 getForObject()
  6. RestTemplate restTemplate = RestTemplateBuilder.create();
  7. String result = restTemplate.getForObject("cse://jaxrs/jaxrshello/saybye", String.class);
  8. }
  9. public static void init() throws Exception {
  10. Log4jUtils.init();
  11. BeanUtils.init();
  12. }
  13. }

说明:

  • URL格式为:cse://microserviceName/path?querystring。以用SpringMVC开发微服务中定义的服务提供者为例,其微服务名称是springmvc,basePath是/springmvchello,那么URL中的microserviceName=springmvc,请求sayhi时的path=springmvchello/sayhi,所以示例代码中请求sayhi的URL是cse://springmvc/springmvchello/sayhi?name=Java Chassis。具体代码示例如下 :
  1. @RestSchema(schemaId = "springmvcHello")
  2. @RequestMapping(path = "/springmvchello", produces = MediaType.APPLICATION_JSON)
  3. //这里 path = “/springmvchello” 中的 springmvchello 就是 上述的basePath
  4. public class SpringmvcHelloImpl implements Hello {
  5. @Override
  6. @RequestMapping(path = "/sayhi", method = RequestMethod.POST)
  7. public String sayHi(@RequestParam(name = "name") String name) {
  8. return "Hello " + name;
  9. }
  10. @Override
  11. @RequestMapping(path = "/sayhello", method = RequestMethod.POST)
  12. public String sayHello(@RequestBody Person person) {
  13. return "Hello person " + person.getName();
  14. }
  15. }

下述代码是示例项目 SpringMVC 的 springmvc-provider 模块 中 resources 目录下 microservice.yaml

  1. APPLICATION_ID: springmvc-sample
  2. service_description:
  3. name: springmvc # 这里就是定义的微服务名称
  4. version: 0.0.2
  5. servicecomb:
  6. service:
  7. registry:
  8. address: http://127.0.0.1:30100
  9. rest:
  10. address: 0.0.0.0:8080
  11. highway:
  12. address: 0.0.0.0:7070
  13. handler:
  14. chain:
  15. Provider:
  16. default: bizkeeper-provider
  17. cse:
  18. service:
  19. registry:
  20. address: http://127.0.0.1:30100 #service center address
  • 使用上述这种URL格式,ServiceComb框架会在内部进行服务发现、熔断容错等处理并最终将请求发送到服务提供者。