Spring Cloud 学习——3.openfeign实现声明式服务调用
1.前言
spring cloud 集成了 feign 组件,来实现声明式的服务调用,不用再在所有服务调用的地方都写 restTemplate 了。
2.添加依赖
spring boot 1.x 环境下,添加 feign 依赖:
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-feign</artifactId> <version>1.x.x</version> </dependency>
spring boot 2.x 环境下,添加 openfeign 依赖
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> <version>2.x.x</version> </dependency>
3.编写一个服务提供者
@RestController @RequestMapping("/user") public class UserController { @GetMapping("/get/{id}") public User get(@PathVariable("id")String id){ System.out.println("/user/get/{id},id=" + id); User user = new User();
user.setId(id);
user.setUsername("onezai");
user.setPassword("123456");
user.setMobile("13128921555");
return user;
}
}
这是一个用户微服务,根据参数id查询用户信息。在服务实现中打印参数id,然后构造一个用户信息返回。
4.编写服务调用者
4.1.启动类添加注解 @EnableFeignClients ,以启用 feign 。
4.2.声明服务调用接口:
@FeignClient("sys") public interface UserClient { @RequestMapping(method = RequestMethod.GET, value = "/sys/user/get/{id}") User getUserById(@PathVariable("id")String id); }
注解说明:
@FeignClient 注解:声明该接口是一个feign类型的服务调用接口,其中默认value属性,指定微服务名(默认是 eureka.instance.appname 指定的值。feign也支持给其它微服务指定别名,那么声明的时候使用别名)
feign 很好的引入了 spring mvc 相关的注解。如上:@RequestMapping 注解指定需要调用的服务的调用方法(http方法)以及调用路径,只需要声明相对路径即可,至于具体的寻址,交给注册中心和负载均衡组件自动完成。
方法的参数和返回值保持与被调用服务的一致就行,cloud 会自动帮我们完成序列化和反序列化的工作。
注意:声明服务调用接口时,指定的服务路径需要包含上下文,上例中即是 /sys (application.properties 文件中 server.servlet.context-path 指定的值)
4.3.调用服务
@RestController @RequestMapping("/") public class HomeController { @Autowired EurekaClient eurekaClient; @Autowired RestTemplate restTemplate; @Autowired UserClient userClient; @GetMapping("/getUser/{id}") public User getUser(@PathVariable("id")String id){ User user = userClient.getUserById(id); System.out.println("user:\n" + JSONObject.fromObject(user).toString()); return user; }
在需要调用该服务的类中,使用 @Autowired 注入 4.2. 中声明的服务调用接口,即可调用该服务,如上。
5.调用结果
5.1.调用结果:
5.2.打印结果:
6.完