上一篇文章《手把手带你利用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碎碎念公众号

SpringCloud系列-利用Feign实现声明式服务调用的更多相关文章

  1. SpringCloud 源码系列(6)—— 声明式服务调用 Feign

    SpringCloud 源码系列(1)-- 注册中心 Eureka(上) SpringCloud 源码系列(2)-- 注册中心 Eureka(中) SpringCloud 源码系列(3)-- 注册中心 ...

  2. spring cloud 入门系列五:使用Feign 实现声明式服务调用

    一.Spring Cloud Feign概念引入通过前面的随笔,我们了解如何通过Spring Cloud ribbon进行负责均衡,如何通过Spring Cloud Hystrix进行服务断路保护,两 ...

  3. SpringCloud学习笔记(3):使用Feign实现声明式服务调用

    简介 Feign是一个声明式的Web Service客户端,它简化了Web服务客户端的编写操作,相对于Ribbon+RestTemplate的方式,开发者只需通过简单的接口和注解来调用HTTP API ...

  4. SpringCloud(四):使用Feign实现声明式服务调用

    一.Feign介绍Feign是一个声明式的伪Http客户端,它使得写Http客户端变得更简单.使用Feign,只需要创建一个接口并注解.它具有可插拔的注解特性,可使用Feign 注解和JAX-RS注解 ...

  5. springCould:使用Feign 实现声明式服务调用

    一.Spring Cloud Feign概念引入通过前面的随笔,我们了解如何通过Spring Cloud ribbon进行负责均衡,如何通过Spring Cloud Hystrix进行服务断路保护,两 ...

  6. Spring Cloud Feign声明式服务调用(转载)+遇到的问题

    转载:原文 总结: 1.pom添加依赖 2.application中填写正确的eureka配置 3.启动项中增加注解 @EnableFeignClients 4.填写正确的调用接口 通过原文使用Fei ...

  7. spring cloud 系列第4篇 —— feign 声明式服务调用 (F版本)

    源码Gitub地址:https://github.com/heibaiying/spring-samples-for-all 一.feign 简介 在上一个用例中,我们使用ribbon+restTem ...

  8. Spring Cloud Feign 声明式服务调用

    目录 一.Feign是什么? 二.Feign的快速搭建 三.Feign的几种姿态 参数绑定 继承特性 四.其他配置 Ribbon 配置 Hystrix 配置 一.Feign是什么? ​ 通过对前面Sp ...

  9. 声明式服务调用:Spring Cloud Feign

    最近在学习Spring Cloud的知识,现将声明式服务调用:Spring Cloud Feign 的相关知识笔记整理如下.[采用 oneNote格式排版]

随机推荐

  1. shell 菜单选择命令

    devices=`adb devices | sed '1d;$d' | sed 's/device//g'`         */sed '1d;$d' : 删除第一行和最后一行*/ device_ ...

  2. Mysql之zip格式的安装

    Mysql之zip格式的安装 一.配置环境变量 首先,我新建一个文件夹,将其改名为MySQL Sever 5.6,其路径为D:\Program Files (x86)\MySQL\MySQL Seve ...

  3. 了解css中px、em、rem的区别并使用Flexible实现vue移动端的适配

    本人java菜鸟一名,若有错误,还请见谅. 1.px和em和rem的定义和区别 px:px像素,是相对单位,相对于屏幕的分辨率而言,也就是说,当屏幕的分辨率不同那么px相同,实际看到的大小也会不同. ...

  4. pt工具校验主从数据一致性之dsns方式

    mysql主从数据一致性校验,常用的方法是Percona-Toolkit的组件pt-table-checksum,这东西怎么用网上一大堆,就不啰嗦了.主要说一下通过dsns方式发现从库的一种方式. p ...

  5. 章节十六、7-DataProviders

    一.当我们的同一个test有多套数据需要进行测试,那么我们就需要用到-->DataProviders package testclasses1; import org.testng.annota ...

  6. Go语言标准库之net_http

    Go语言内置的net/http包十分的优秀,提供了HTTP客户端和服务端的实现. net/http介绍 Go语言内置的net/http包提供了HTTP客户端和服务端的实现. HTTP协议 超文本传输协 ...

  7. CF785D Anton and School – 2

  8. idea控制台乱码解决方案

    第一步:修改intellij idea配置文件: 找到intellij idea安装目录,bin文件夹下面idea64.exe.vmoptions和idea.exe.vmoptions这两个文件,分别 ...

  9. Winform中实现更改DevExpress的RadioGroup的选项时更改其他控件(TextEdit、ColorPickEdit)的值

    场景 Winform中实现读取xml配置文件并动态配置ZedGraph的RadioGroup的选项: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article ...

  10. Python获取列表中的最后一个或者倒数第几个的方案

    print(members[3]) 灵魂所在“ - (负号 )” 我们先来创建一个列表,和php中的数组一样. members = ['张三','李四','王五','芳芳','小明','小王'] 按照 ...