zoukankan      html  css  js  c++  java
  • 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:
    " + JSONObject.fromObject(user).toString());
            return user;
        }

        在需要调用该服务的类中,使用 @Autowired 注入 4.2. 中声明的服务调用接口,即可调用该服务,如上。

    5.调用结果

        5.1.调用结果:

    feign调用结果

        5.2.打印结果:

    image

    6.完

  • 相关阅读:
    servlet技术学习随笔
    python使用openpyxl读取excel文件
    课后作业-阅读任务-阅读提问-3
    课后作业-阅读任务-阅读提问-2
    课后作业-阅读任务-阅读笔记3
    构建之法:现代软件工程-阅读笔记2
    《构建之法:现代软件工程-阅读笔记》
    结对编程需求分析
    团队-团队编程项目作业名称-需求分析
    团队-团队编程项目作业名称-成员简介及分工
  • 原文地址:https://www.cnblogs.com/coding-one/p/12295881.html
Copyright © 2011-2022 走看看