• SpringCloud系列-利用Feign实现声明式服务调用


    上一篇文章《手把手带你利用Ribbon实现客户端的负载均衡》介绍了消费者通过Ribbon调用服务实现负载均衡的过程,里面所需要的参数需要在请求的URL中进行拼接,但是参数太多会导致拼接字符串的效率低下,本文将介绍一种更好的方案,利用Feign实现声明式服务调用。

    本文目录

    一、Feign简介二、搭建注册中心三、服务提供者四、Feign服务消费者五、服务调用实战

    一、Feign简介

    Feign是一个声明式的Web Service客户端,它的目的就是让Web Service调用更加简单。

    Feign提供了HTTP请求的模板,通过编写简单的接口和插入注解,就可以定义好HTTP请求的参数、格式、地址等信息,而Feign则会完全代理HTTP请求,我们只需要像调用方法一样调用它就可以完成服务请求及相关处理。

    总起来说,Feign具有如下特性:

    • 可插拔的注解支持,包括Feign注解和JAX-RS注解;
    • 支持可插拔的HTTP编码器和解码器;
    • 支持Hystrix和它的Fallback;
    • 支持Ribbon的负载均衡;
    • 支持HTTP请求和响应的压缩。

    二、搭建注册中心

    首先新建一个SpringBoot项目,命名spring-cloud-eureka,然后按照下面步骤编写代码即可。

    1. pom.xml代码

    添加eureka-server的依赖,代码如下:

        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter</artifactId>
            </dependency>

            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
            </dependency>

            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <scope>test</scope>
            </dependency>
        </dependencies>

        <dependencyManagement>
            <dependencies>
                <dependency>
                    <groupId>org.springframework.cloud</groupId>
                    <artifactId>spring-cloud-dependencies</artifactId>
                    <version>Finchley.RELEASE</version><!-- eureka版本 -->
                    <type>pom</type>
                    <scope>import</scope>
                </dependency>
            </dependencies>
        </dependencyManagement>
    1. 启动类代码

    启动类添加注解@EnableEurekaServer即可,代码如下:

    @EnableEurekaServer
    @SpringBootApplication
    public class SpringCloudEurekaApplication {
        public static void main(String[] args) {
            SpringApplication.run(SpringCloudEurekaApplication.class, args);
        }
    }
    1. 配置文件

    使用yml的配置文件,application.yml配置如下:

    server:
      port: 9001 #服务端口
    eureka:
      instance:
        hostname: localhost
      client:
        register-with-eureka: false #是否将eureka自身作为应用注册到eureka注册中心
        fetch-registry: false #为true时,可以启动,但报异常:Cannot execute request on any known server
        serviceUrl:
          defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/

    配置项说明:

    1. server.port=9001表示设置该服务注册中心的端口号 

    2. eureka.instance.hostname=localhost表示设置该服务注册中心的hostname 

    3. eureka.client.register-with-eureka=false,由于我们目前创建的应用是一个服务注册中心,而不是普通的应用。默认情况下,这个应用会向注册中心(也是它自己)注册它自己,设置为false表示禁止这种默认行为 

    4. eureka.client.fetch-registry=false,表示不去检索其他的服务,因为服务注册中心本身的职责就是维护服务实例,它也不需要去检索其他服务
    1. 运行截图

    打开浏览器访问http://localhost:9001/,可以看到注册中心以及启动,运行截图如下:


    注册中心运行截图

    三、服务提供者

    服务注册中心有了之后,我们可以向这个服务注册中心注册一个服务提供者,新建一个SpringBoot项目,命名spring-cloud-user-service,提供用户查询服务,然后按照下面步骤编写代码即可。

    1. pom.xml代码

    添加eureka-client的依赖,代码如下:

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.60</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
    </dependencies>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Finchley.RELEASE</version><!-- eureka版本 -->
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
    1. 启动类代码

    启动类添加注解@EnableEurekaClient即可,代码如下:

    @EnableEurekaClient
    @SpringBootApplication
    public class UserServiceDemoApplication {

        public static void main(String[] args) {
            SpringApplication.run(UserServiceDemoApplication.class, args);
        }
    }

    添加一个提供用户服务的UserController,代码如下:

    /**
     * 用户服务
     */

    @Slf4j
    @RestController
    @RequestMapping("/provider")
    public class UserController {

        static Map<Integer, User> userMap = new HashMap<>();

        static {
            //模拟数据库
            User user1 = new User(1"张三""123456");
            userMap.put(1, user1);
            User user2 = new User(2"李四""123123");
            userMap.put(2, user2);
        }

        /**
         * 根据id 查询
         */

        @RequestMapping("/getUser")
        public String getUser(Integer id) {
            log.info("调用getUser接口,id={}",id);
            User user = userMap.get(id);
            return JSON.toJSONString(user);
        }
    1. 配置文件

    使用yml的配置文件,application.yml配置如下:

    server:
      port: 8100 #服务端口
    eureka:
      client:
        serviceUrl:
          defaultZone: http://localhost:9001/eureka/
    spring:
      application:
        name: user-service

    四、Feign服务消费者

    首先新建一个SpringBoot项目,命名spring-cloud-consumer-fegin,然后按照下面步骤编写代码即可。

    1. pom.xml代码

    添加eureka-client的依赖,代码如下:

       <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-openfeign</artifactId>
            </dependency>

            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
            </dependency>

            <dependency>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
                <optional>true</optional>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <scope>test</scope>
            </dependency>
        </dependencies>


        <dependencyManagement>
            <dependencies>
                <dependency>
                    <groupId>org.springframework.cloud</groupId>
                    <artifactId>spring-cloud-dependencies</artifactId>
                    <version>Finchley.RELEASE</version><!-- eureka版本 -->
                    <type>pom</type>
                    <scope>import</scope>
                </dependency>
            </dependencies>
        </dependencyManagement>
    1. 启动类代码

    添加@EnableFeignClients注解,就代表启启用feign客户端。

    启动类添加注解@EnableEurekaClient,也注册到注册中心,代码如下:

    @EnableEurekaClient
    @EnableFeignClients
    @SpringBootApplication
    public class SpringCloudConsumerFeginApplication {

        public static void main(String[] args) {
            SpringApplication.run(SpringCloudConsumerFeginApplication.class, args);
        }

    }
    1. 使用注解@FeignClient 定义feign客户端

    下面将定义了一个feign客户端,将远程服务http://user-service//provider/getUser映射为一个本地Java方法调用。

    IFeginService接口代码如下:

    //表示"user-service"的服务 提供
    @FeignClient(value = "user-service")
    public interface IFeginService {

        @RequestMapping(value = "/provider/getUser")
        public String getUser(@RequestParam("id") Integer id);
    }

    注解说明:

    @FeignClient

    属性名默认值作用
    value 空字符串 调用服务名称,和name属性相同
    name 空字符串 调用服务名称,和value属性相同
    url 空字符串 全路径地址或hostname,http或https可选
    path 空字符串 自动给所有方法的requestMapping前加上前缀,类似与controller类上的requestMapping
    1. 添加一个Controller

    添加一个Controller,使用注解@Autowired使用上面所定义feign的客户端,用于调用服务提供者。

    @RestController
    @RequestMapping("/consumer")
    public class FeginController {

        @Autowired
        private IFeginService feginService;

        @GetMapping("/getUser")
        public String getUser(Integer id) {
            return feginService.getUser(id);
        }
    }
    1. 配置文件

    使用yml的配置文件,application.yml配置如下:

    server:
      port: 8083 #服务端口
    eureka:
      client:
        serviceUrl:
          defaultZone: http://localhost:9001/eureka/
    spring:
      application:
        name: fegin-consumer

    五、服务调用实战

    1. 启动服务中心并注册服务

    代码编写之后,按顺序启动spring-cloud-eureka、spring-cloud-user-service和spring-cloud-consumer-fegin,先访问注册中心http://localhost:9001/,出现下图说明注册中心和两个服务已经注册成功。


    注册中心运行截图

    启动spring-cloud-user-service时候启动两个服务8100,启动命令如下:

    java -jar spring-cloud-user-service-0.0.1-SNAPSHOT.jar --server.port=8100
    1. 服务调用

    打开浏览器访问http://localhost:8083/consumer/getUser?id=1,访问成功后截图如下:


    请求成功截图

     

    到此SpringCloud整合Feign调用服务的过程已经全部实现,有问题欢迎留言沟通哦!

    完整源码地址: https://github.com/suisui2019/springboot-study

    推荐阅读

    1.手把手带你利用Ribbon实现客户端的负载均》
    2.SpringCloud搭建注册中心与服务注册
    3.SpringCloud实现服务间调用(RestTemplate方式)
    4.别在 Java 代码里乱打日志了,这才是正确的打日志姿势!
    5.编码神器Lombok,学会后开发效率至少提高一倍!


    限时领取免费Java相关资料,涵盖了Java、Redis、MongoDB、MySQL、Zookeeper、Spring Cloud、Dubbo/Kafka、Hadoop、Hbase、Flink等高并发分布式、大数据、机器学习等技术。
    关注下方公众号即可免费领取:

    Java碎碎念公众号Java碎碎念公众号

     

  • 相关阅读:
    AOP面向方面编程
    Struts2基于注解的Action配置
    地图api汇总
    Visual C++ 嵌入汇编代码
    C# ASP.net中用到的JWT身份验证
    Asp.Net Forms 身份验证
    .Net 面试常见问题
    Web Api 自动生成帮助文档
    .Net常见的一些区别
    创建Silverlight 5浏览器内受信应用
  • 原文地址:https://www.cnblogs.com/haha12/p/11675941.html
Copyright © 2020-2023  润新知