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.调用结果:

feign调用结果

    5.2.打印结果:

image

 

6.完

posted @ 2020-02-11 17:28  不爱刺猫的鱼  阅读(558)  评论(0编辑  收藏  举报