SpringCloud学到刚好够用之四-服务消费者(Feign).md

Posted by lizhao on 07-09,2019

SpringCloud学到刚好够用之四-服务消费者(Feign)

[toc]

总览

spring cloud相关技术栈在现在各个互联网公司的普及率已经很高了,这次去面试,基本面试官都有提到这一块,但是有没有实际接触过,只能遗憾的摇摇头。这里记录下学习过程,将一些踩坑的经验写出来,供大家参考。这个系列只会写到很浅的一部分,如有兴趣深入,可以看"这个系列",将会给大家一个方向哈

基于SpringCloud的Greenwich.SR1,Jdk11,Maven,Idea开发

看的不过瘾

进阶使用

源码分析

简介

Feign是Netflix开发的声明式、模板化的HTTP客户端, Feign可以帮助我们更快捷、优雅地调用HTTP API。

在Spring Cloud中,使用Feign非常简单——创建一个接口,并在接口上添加一些注解,代码就完成了。Feign支持多种注解,例如Feign自带的注解或者JAX-RS注解等。

Spring Cloud对Feign进行了增强,使Feign支持了Spring MVC注解,并整合了Ribbon和Eureka,从而让Feign的使用更加方便。

Spring Cloud Feign是基于Netflix feign实现,整合了Spring Cloud Ribbon和Spring Cloud Hystrix,除了提供这两者的强大功能外,还提供了一种声明式的Web服务客户端定义的方式。

Spring Cloud Feign帮助我们定义和实现依赖服务接口的定义。在Spring Cloud feign的实现下,只需要创建一个接口并用注解方式配置它,即可完成服务提供方的接口绑定,简化了在使用Spring Cloud Ribbon时自行封装服务调用客户端的开发量。

Spring Cloud Feign具备可插拔的注解支持,支持Feign注解、JAX-RS注解和Spring MVC的注解。

准备活动

  1. 一个eureka
  2. 2个服务名称相同的服务(这里可以直接使用,pro002-eureka-test pro003-ribbon-hi-project-other)
  3. Feign服务

Feign服务

主要步骤

引入包,spring-cloud-starter-openfeign

配置文件,端口8765

启动类Application加上EnableFeignClients注解

写一个FeignClient,FeignClient(value = "service-hi")

写一个controller去注入并调用FeignClient

上述步骤关键代码及图片

  1. 引入包,spring-cloud-starter-openfeign
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.1.4.RELEASE</version>
    <relativePath/> <!-- lookup parent from repository -->
  </parent>
  <groupId>com.lizhaoblog.scl</groupId>
  <artifactId>pro004-feign</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <name>pro004-feign</name>
  <description>feign project</description>

  <properties>
    <java.version>11</java.version>
    <spring-cloud.version>Greenwich.SR1</spring-cloud.version>
  </properties>

  <dependencies>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
    </dependency>
    <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-openfeign</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>${spring-cloud.version}</version>
        <type>pom</type>
        <scope>import</scope>
      </dependency>
    </dependencies>
  </dependencyManagement>

  <build>
    <plugins>
      <plugin>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-maven-plugin</artifactId>
      </plugin>
    </plugins>
  </build>

</project>

  1. 配置文件,端口8765
eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:8761/eureka/
server:
  port: 8765
spring:
  application:
    name: service-feign


  1. 启动类Application加上EnableFeignClients注解
package com.lizhaoblog.scl.pro004feign;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients;

@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
public class Pro004FeignApplication {

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



  1. 写一个FeignClient,FeignClient(value = "service-hi")
/*
 * Copyright (C), 2015-2019
 * FileName: PointHiService
 * Author:   zhao
 * Date:     2019/4/20 22:01
 * Description: feign请求hi接口
 * History:
 * <author>          <time>          <version>          <desc>
 * 作者姓名           修改时间           版本号              描述
 */
package com.lizhaoblog.scl.pro004feign.service;

import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;

/**
 * 〈一句话功能简述〉<br>
 * 〈feign请求hi接口〉
 *
 * @author zhao
 * @date 2019/4/20 22:01
 * @since 1.0.0
 */
@FeignClient(value = "service-hi")
public interface PointHiService {
    @RequestMapping(value = "/hi", method = RequestMethod.GET)
    String sayHiFromClientOne(@RequestParam(value = "name") String name);
}
  1. 写一个controller去注入并调用FeignClient
/*
 * Copyright (C), 2015-2019
 * FileName: HiController
 * Author:   zhao
 * Date:     2019/4/20 22:03
 * Description: 控制器
 * History:
 * <author>          <time>          <version>          <desc>
 * 作者姓名           修改时间           版本号              描述
 */
package com.lizhaoblog.scl.pro004feign.controller;

import com.lizhaoblog.scl.pro004feign.service.PointHiService;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

/**
 * 〈一句话功能简述〉<br>
 * 〈控制器〉
 *
 * @author zhao
 * @date 2019/4/20 22:03
 * @since 1.0.0
 */
@RestController
public class HiController {

    @Autowired
    PointHiService pointHiService;

    @RequestMapping(value = "/hi", method = RequestMethod.GET)
    public String sayHi(@RequestParam String name) {
        return pointHiService.sayHiFromClientOne(name);
    }
}

测试:访问feign服务

主要步骤

运行eureka,hi服务1,hi服务2,feign服务

打开eureka面板查看服务数

访问http://localhost:8765/hi?name=lizhao

上述步骤关键代码及图片

运行eureka,hi服务1,hi服务2,feign服务

打开eureka面板查看服务数

DS Replicas
Instances currently registered with Eureka
Application	AMIs	Availability Zones	Status
SERVICE-FEIGN	n/a (1)	(1)	UP (1) - localhost:service-feign:8765
SERVICE-HI	n/a (2)	(2)	UP (2) - localhost:service-hi:8762 , localhost:service-hi:8763

访问http://localhost:8765/hi?name=lizhao

hi lizhao,i am from port:8763
hi lizhao,i am from port:8762
hi lizhao,i am from port:8763
hi lizhao,i am from port:8762

总结

这东西整合了ribbon,也是个负载均衡客户端

广告时间

我是小王,一个喜欢抛转的码人。