
服务调用
在之前的教程中我们已经有了 「user」 服务,现在我们有另外一个服务 「shop」 ,如果现在 「shop」 服务需要调用 「user」 服务中的接口查询用户信息,我们该怎么做呢?首先我们知道 「user」 服务提供了下面的http接口,接口定义如下:
@RestController
@RequestMapping("user")
public class UserController {
@Autowired
private UserService userService;
/**
* 根据用户ID获取用户信息
* @param id 用户ID
* @return
*/
@GetMapping()
public JsonResponse<UserDto> getUser(@RequestParam("id")Integer id){
UserDto user = userService.getUser(id);
return JsonResponse.ok(user);
}
}
首先你能想到最快的方式就是直接使用HttpClient客户端工具来调用接口,这里为了方便直接使用Spring提供的RestTemplate工具来调用接口,当然你也可以使用其他工具。
try {
String body = restTemplate.getForObject("http://127.0.0.1:8000/user?id={id}", String.class, id);
ObjectMapper objectMapper = new ObjectMapper();
JsonResponse<UserDto> jsonResponse = objectMapper.readValue(body, new TypeReference<JsonResponse<UserDto>>() {
});
if (!ResponseCode.OK.getCode().equals(jsonResponse.getCode())){
throw new YsException(String.format("错误的响应码:[%s]",body));
}
return JsonResponse.ok(jsonResponse.getData());
} catch (Exception e) {
log.error("调用user-server失败!",e);
}
return JsonResponse.error("获取用户信息失败",null);
上面可能是你使用RestTemplate来调用接口的方式。首先可以肯定的是这种方式肯定是可以实现我们的任务的。但是这里面存在一些问题:
-
代码太过于复杂。首先我们需要处理请求参数和响应结果,这部分代码都是类似的写起来很麻烦。 -
更换客户端需要修改代码。当然我们这里使用的是RestTemplate,它是可以设置底层的HttpClient实现具体实现的。假如我们使用的是Apache HttpClient工具包或者OkHttpClient,我们写的服务调用代码是需要大改的。
当然实际的问题还远不止如此,这里就不一一列举了。有可能你用过Retrofit这个工具,这个工具跟OkHttp是同一家公司的产品。使用Retrofit可以通过Interface的方式调用Http接口,但是这个工具底层的HttpClient工具貌似只支持OkHttp,对于像Apache HttpClient它是不支持的。
OpenFeign
而这里我们要说的OpenFeign它解决了微服务调用存在的问题,该项目是Spring基于Feign开发的一个服务调用组件。Feign它的底层支持常见的HttpClient工具,例如OkHttpClient、Apache HttpClient等,同时它提供了与Retrofit一样支持接口的方式调用Http请求。原生的Feign提供了自己的一套注解,用来支持Http接口的调用。而SpringCloud中支持使用SpringMVC中的注解来调用接口。而想要在SpringCloud中使用OpenFeign步骤也很简单,通过下面几步就能完成:
引入OpenFeign组件
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
创建服务调用接口
@FeignClient(name = "user-server",url = "http://localhost:8000/user")
public interface UserService {
/**
* 根据用户ID获取用户信息
* @param id 用户ID
* @return
*/
@GetMapping()
JsonResponse<UserDto> getUser(@RequestParam("id")Integer id);
}
从上面的代码可以看到,这个接口的定义与 「user」 服务中的接口很相似,只不过它是一个Interface,而没有具体的实现。
重点需要关注的在类上面的 「@FeignClient」 注解,在这个注解中定义了接口请求的URL。同时这个注解中还有很多其他值可以设置,我们这里只是一个快速入门了解的示例所以就不多说了,具体的可以去Spring官网参考相关文档。
服务调用
@Autowired
private UserService userService;
@GetMapping("feign")
public JsonResponse<UserDto> getUserInfo2(@RequestParam("id")Integer id){
JsonResponse<UserDto> jsonResponse = userService.getUser(id);
if (!ResponseCode.OK.getCode().equals(jsonResponse.getCode())){
throw new YsException(String.format("错误的响应码:[%s]",jsonResponse));
}
return JsonResponse.ok(jsonResponse.getData());
}
上面就是我们调用服务的使用示例,看上去是不是很简单。我们并没有去实现 「UserService」 接口,它的实现是由OpenFeign去帮我创建代理实现的。
当然OpenFeign的工具远远不止于此,它还可以配置SpringCloud中的LoadBalance来实现负载均衡,还可以结合circuitBreaker来实现熔断和降级等功能,关于这部分内容在后面将到了再细说。
总结
简单的来说,OpenFeign主要是用来实现服务之间的调用的,它解决了服务之间调用的一些麻烦的问题。
可以通过下面方式下载本章节示例代码:
git clone -b openFeign https://gitee.com/zengchao_workspace/ys.git
欢迎关注公号:「一个java菜鸟程序员」 ,本公众号会不定期更新各类文章,欢迎订阅观看谢谢!
原文始发于微信公众号(一只菜鸟程序员):SpringBoot服务调用-OpenFeign-H版
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/73125.html