7.Feign

7.1.Feign简介

声明式服务调用Feign简单介绍下;

Feign是一个声明式的Web Service客户端,它使得编写Web Serivce客户端变得更加简单。我们只需要使用Feign来创建一个接口并用注解来配置它既可完成。

它具备可插拔的注解支持,包括Feign注解和JAX-RS注解。Feign也支持可插拔的编码器和解码器。

Spring Cloud为Feign增加了对Spring MVC注解的支持,还整合了Ribbon和Eureka来提供均衡负载的HTTP客户端实现。

这里说下实际使用,前面Ribbon调用服务提供者,我们通过restTemplate调用,缺点是,多个地方调用,同一个请求要写多次,不方便统一维护,

这时候Feign来了,就直接把请求统一搞一个service作为FeignClient,然后其他调用Controller需要用到的,直接注入service,直接调用service方法即可;

同时Feign整合了Ribbon和Eureka,所以要配置负载均衡的话,直接配置Ribbon即可,无其他特殊地方;

当然Fiegn也整合了服务容错保护,断路器Hystrix,后面再说。

7.2.Feign实战应用

  第一步:在common项目里建一个service(实际项目中是多个service)作为Feign客户端,用Feign客户端来调用服务器提供者,当然可以配置负载均衡;

  Feign客户端定义的目的,就是为了方便给其他项目调用;

修改 microservice-common

pom.xml引入Feign依赖:

        <!-- feign-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-feign</artifactId>
</dependency>

在common中建立TicketClientService接口:

 1 package com.wfd360.service;
2
3 import com.wfd360.model.Ticket;
4 import org.springframework.cloud.netflix.feign.FeignClient;
5 import org.springframework.web.bind.annotation.GetMapping;
6 import org.springframework.web.bind.annotation.PathVariable;
7 import org.springframework.web.bind.annotation.PostMapping;
8
9 import java.util.List;
10
11 /**
12 * Created by 姿势帝-博客园 on 2019/3/29.
13 * 欢迎添加笔者wx(851298348)共同探讨、学习!
14 */
15
16 /**
17 * feign客户端接口
18 */
19 @FeignClient(value = "MICROSERVICE-TICKET") //调用的服务名称
20 public interface TicketClientService {
21 /**
22 * 根据id查询车票信息
23 *
24 * @param id
25 * @return
26 */
27 @GetMapping(value = "/ticket/get/{id}")
28 public Ticket get(@PathVariable("id") Integer id);
29
30 /**
31 * 查询车票信息
32 *
33 * @return
34 */
35 @GetMapping(value = "/ticket/list")
36 public List<Ticket> list();
37
38 /**
39 * 添加或者修改车票信息
40 *
41 * @param ticket
42 * @return
43 */
44 @PostMapping(value = "/ticket/save")
45 public boolean save(Ticket ticket);
46
47 /**
48 * 根据id删除车票信息
49 *
50 * @return
51 */
52 @GetMapping(value = "/ticket/delete/{id}")
53 public boolean delete(@PathVariable("id") Integer id);
54 }

  第二步:为了不影响之前的ribbon消费者,我们在这里重新建立一个基于Feign消费者项目,本质上与ribbon的消费者一样的;

  参考microservice-student-consumer-80建一个microservice-student-consumer-feign-80

  代码都复制一份,包括pom.xml,pom.xml里加下 feign依赖,和第一步一样;

  第三步:加注解,启动加个注解@EnableFeignClients,支持下Feign;

  重点注意:要注释掉@EnableEurekaClient

  

  第四步:修改Contrller,代码如下:

 1 package wfd360.controller;
2
3 import com.wfd360.model.Ticket;
4 import com.wfd360.service.TicketClientService;
5 import org.springframework.beans.factory.annotation.Autowired;
6 import org.springframework.stereotype.Controller;
7 import org.springframework.web.bind.annotation.*;
8
9 import java.util.List;
10
11 /**
12 * Created by 姿势帝-博客园 on 2019/3/26.
13 * 欢迎添加笔者wx(851298348)共同探讨、学习!
14 */
15
16 /**
17 * 知识点:@RestController注解相当于@ResponseBody + @Controller合在一起的作用。
18 */
19 @Controller
20 @RequestMapping("/ticket")
21 public class TicketConsumerController {
22 @Autowired
23 private TicketClientService ticketClientService;
24
25 /**
26 * 添加或者修改车票信息
27 *
28 * @param ticket
29 * @return
30 */
31 @PostMapping(value = "/save")
32 @ResponseBody
33 public boolean save(Ticket ticket) {
34
35 return ticketClientService.save(ticket);
36 }
37
38 /**
39 * 查询车票信息
40 *
41 * @return
42 */
43 @SuppressWarnings("unchecked")
44 @GetMapping(value = "/list")
45 @ResponseBody
46 public List<Ticket> list() {
47 return ticketClientService.list();
48 }
49
50 /**
51 * 根据id查询车票信息
52 *
53 * @return
54 */
55 @GetMapping(value = "/get/{id}")
56 @ResponseBody
57 public Ticket get(@PathVariable("id") Integer id) {
58
59 return ticketClientService.get(id);
60 }
61
62 /**
63 * 根据id删除车票信息
64 *
65 * @return
66 */
67 @GetMapping(value = "/delete/{id}")
68 @ResponseBody
69 public boolean delete(@PathVariable("id") Integer id) {
70 try {
71 ticketClientService.delete(id);
72 return true;
73 } catch (Exception e) {
74 return false;
75 }
76 }
77 }

现在用Fiegn,所以把restTemplate去掉,改成注入service,调用service方法来实现服务的调用;

  第五步:测试负载均衡

启动3个eureak,在启动3个服务提供者,最后启动 feign消费者,访问

http://localhost/ticket/list

SpringCloudConfig类的myRule,大伙自行修改测试即可;

  Feign实战应用就讲到这里,案例的源码,大家可以下载v7版本!

SpringCloud-day07-Feign的更多相关文章

  1. SpringCloud使用Feign调用其他客户端带参数的接口,传入参数为null或报错status 405 reading IndexService#del(Integer);

    SpringCloud使用Feign调用其他客户端带参数的接口,传入参数为null或报错status 405 reading IndexService#del(Integer); 第一种方法: 如果你 ...

  2. SpringCloud 在Feign上使用Hystrix(断路由)

    SpringCloud  在Feign上使用Hystrix(断路由) 第一步:由于Feign的起步依赖中已经引入了Hystrix的依赖,所以只需要开启Hystrix的功能,在properties文件中 ...

  3. SpringCloud(5)---Feign服务调用

    SpringCloud(5)---Feign服务调用 上一篇写了通过Ribbon进行服务调用,这篇其它都一样,唯一不一样的就是通过Feign进行服务调用. 注册中心和商品微服务不变,和上篇博客一样,具 ...

  4. springcloud 实战 feign使用中遇到的相关问题

    springcloud 实战 feign使用中遇到的相关问题 1.使用feign客户端调用其他微服务时,session没有传递成功,sessionId不一样. /** * @author xbchen ...

  5. springcloud 之 feign的重复性调用 优化

    最近有一个springcloud的feign请求,用于获取坐标经纬度的信息,返回结果永远是固定不变的,所以考虑优化一下,不然每次转换几个坐标都要去请求feign,返回的所有坐标信息,数据量太大导致耗时 ...

  6. SpringCloud之Feign负载均衡(四)

    整合Feign pom.xml <dependency> <groupId>org.springframework.cloud</groupId> <arti ...

  7. 解决SpringCloud使用Feign跨服调用时header请求头中的信息丢失

    在使用SpringCloud进行Feign跨服调用时header请求头中的信息会丢失,是因为Feign是不会带上当前请求的Cookie信息和头信息的,这个时候就需要重写请求拦截. 1.需要重写Requ ...

  8. SpringCloud+Eureka+Feign+Ribbon的简化搭建流程,加入熔断,网关和Redis缓存[2]

    目录 前提:本篇是基于 SpringCloud+Eureka+Feign+Ribbon的简化搭建流程和CRUD练习[1] 的修改与拓展 1.修改consumer的CenterFeign.java,把返 ...

  9. SpringCloud系列——Feign 服务调用

    前言 前面我们已经实现了服务的注册与发现(请戳:SpringCloud系列——Eureka 服务注册与发现),并且在注册中心注册了一个服务myspringboot,本文记录多个服务之间使用Feign调 ...

  10. 31.【微服务架构】SpringCloud之Feign(五)

    Feign简介 Feign 是一个声明web服务客户端,这便得编写web服务客户端更容易,使用Feign 创建一个接口并对它进行注解,它具有可插拔的注解支持包括Feign注解与JAX-RS注解,Fei ...

随机推荐

  1. python中的RE模块

    re模块(* * * * *) 就其本质而言,正则表达式(或 RE)是一种小型的.高度专业化的编程语言,(在Python中)它内嵌在Python中,并通过 re 模块实现.正则表达式模式被编译成一系列 ...

  2. EntityFramework Inner Exception Catch

    在保存时加入这一段,就可以查看error具体是哪里出错了.正式发布需要删除这段,try catch毕竟会影响性能 try { entity.SaveChanges(); } catch (DbEnti ...

  3. Error in loadNamespace 的解决之道

    Error in loadNamespace(j <- i[[1L]], c(lib.loc, .libPaths()), versionCheck = vI[[j]])   在构建比较复杂的环 ...

  4. microsoft.jet.oledb.4.0 未注册

    64位系统已经不支持4.0 解决办法 1.下载 ACE2010的驱动,64位的. http://www.microsoft.com/downloads/zh-cn/details.aspx?famil ...

  5. innodb使用大字段text,blob的一些优化建议(转)

    原文 https://yq.aliyun.com/articles/9072 最近看到一些老应用,在表结构的设计上使用了text或者blob的字段:其中一个应用,对blob字段的依赖非常的严重,查询和 ...

  6. linux dd命令 创造一个文件

    创造一个1G的文件 dd if=/dev/zero of=/nod/tmp/test bs=1M count=1024 创造一个1T的文件 [root@oracledg tmp]# dd if=/de ...

  7. mysql修改root密码及修改密码过程中报错的解决方案

    参考网站: https://www.linuxidc.com/Linux/2018-05/152586.htmhttps://www.cnblogs.com/wangbaobao/p/7087032. ...

  8. mysql 关联

    自关联 设计省信息的表结构provinces id ptitle 设计市信息的表结构cityscitys表的proid表示城市所属的省,对应着provinces表的id值 id ctitle proi ...

  9. eShopOnContainers 看微服务③:Identity Service

    引言 通常,服务所公开的资源和 API 必须仅限受信任的特定用户和客户端访问.那进行 API 级别信任决策的第一步就是身份认证——确定用户身份是否可靠. 在微服务场景中,身份认证通常统一处理.一般有两 ...

  10. 04 Javascript的数据类型 数组 函数

    javascript:包含ECMAscript DOM BOM 描述了以下内容: 语法 类型 语句 关键字 保留字 运算符 对象 引入方式: <script> alert(123) < ...