SpringCloud学到刚好够用之四-服务消费者(Feign)
总览
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的注解。
准备活动
- 一个eureka
- 2个服务名称相同的服务(这里可以直接使用,pro002-eureka-test
pro003-ribbon-hi-project-other) - Feign服务
Feign服务
主要步骤
引入包,spring-cloud-starter-openfeign
配置文件,端口8765
启动类Application加上EnableFeignClients注解
写一个FeignClient,FeignClient(value = “service-hi”)
写一个controller去注入并调用FeignClient
上述步骤关键代码及图片
- 引入包,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>
- 配置文件,端口8765
eureka:
client:
serviceUrl:
defaultZone: http://localhost:8761/eureka/
server:
port: 8765
spring:
application:
name: service-feign
- 启动类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);
}
}
- 写一个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);
}
- 写一个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,也是个负载均衡客户端
广告时间
我是小王,一个喜欢抛转的码人。
- 所有代码都在这里:https://gitee.com/lizhaoandroid/spring-cloud-learning
- 本片对应的章节:pro004
- 我的csdn:https://lizhao.blog.csdn.net
- 我的联系方式:QQ3060507060
- 我的公众号:lizhaoblog、小王老店
- 我的银行卡及密码:*****************/