一、简介

我们可以看到上一篇文章的消费者这边调用Service时比较麻烦,所以我们可以使用Feign来简化这部分操作,它底层也是使用Ribbon实现的只是Ribbon支持HTTP和TCP两种通信协议,而Feign只支持HTTP一种,同样支持负载均衡,所以能满足90%以上的需求了。

二、搭建生产者模块

其实这部分是通用的,对于消费者这边使用什么Client并没有影响,Eureka还是使用之前搭建好的,生产者模块也用搭建好的,我们新建一个controller用于承接service,这边就算完成了

import javademo.tyh.model.hotel.BaseInfoModel;
import javademo.tyh.model.hotel.ResponseModel;
import javademo.tyh.model.hotel.SearchModel;
import javademo.tyh.service.hotel.service.HotelService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody; import javax.servlet.http.HttpServletRequest;
import java.util.List; @Controller
@RequestMapping("/api/hotel")
public class HotelController { //自动注入请求对象,查看header信息
@Autowired
HttpServletRequest request; @Autowired
HotelService service; @ResponseBody
@RequestMapping("/test")
public void test() {
//do something...
} @ResponseBody
@RequestMapping("/get")
public BaseInfoModel get(@RequestParam(defaultValue = "0") int id) {
String tyh = request.getHeader("taiyonghai");//获取Header头信息
System.out.println("参数为:" + id);
return service.get(id);
}
//设置参数为@RequestBody可以自动序列化为对象
@ResponseBody
@RequestMapping("/list")
public ResponseModel<List<BaseInfoModel>> list(@RequestBody SearchModel search) {
System.out.println("参数为:" + search.getName());
List<BaseInfoModel> list = service.list();
ResponseModel<List<BaseInfoModel>> respModel = new ResponseModel<>();
respModel.setCode("000000");
respModel.setMsg("操作成功");
respModel.setData(list);
return respModel;
}
}

添加通用Model实体,同样不生成get/set方法,自己生成吧

import com.baomidou.mybatisplus.annotations.TableName;
import java.time.LocalDateTime; @TableName("base_info")
public class BaseInfoModel {
private int id;
private String nickname;
private LocalDateTime updateTime;
}
public class SearchModel {
private int id;
private String name;
}
public class ResponseModel<T> {
private String code;
private String msg;
private T data;
}

三、搭建消费者模块——Feign

还是创建一个Maven模块,看一下我的项目结构

  

1、修改pom.xml文件,增加对spring boot、spring cloud、feign的引用

    <dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.0.3.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Finchley.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<!-- import spring boot -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- import openfeign -->
<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>
</dependencies> <build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>

2、新建resources文件夹,新建application.yml配置文件,并修改内容如下

#设置自己的程序名称
spring:
application:
name: javademo-tyh-web-hotel
#thymeleaf 配置
thymeleaf:
encoding: UTF-8
prefix: classpath:/templates
cache: false
#服务注册中心地址(刚刚搭建的Eureka Server的地址)
eureka:
client:
#是否向服务中心注册自己
register-with-eureka: false
#设置eureka服务中心的地址
service-url:
defaultZone: http://localhost:11000/eureka
#设置自己启动的端口
server:
port: 13000

3、修改main()方法的类,增加Feign的注解

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.openfeign.EnableFeignClients; //引入Feign注解
@EnableFeignClients
@SpringBootApplication
public class AppWebHotel {
public static void main(String[] args) {
SpringApplication.run(AppWebHotel.class, args);
}
}

4、新建service文件夹,新建HotelService的Interface用来执行Feign向后端服务生产者的调用,指明服务生产者名称,接口方法指明具体的服务路由,这种方式比Ribbon简单很多,而且更直观更像调用后台方法

import javademo.tyh.model.hotel.BaseInfoModel;
import javademo.tyh.model.hotel.ResponseModel;
import javademo.tyh.model.hotel.SearchModel;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.stereotype.Service;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import java.util.List; @Service
@FeignClient("javademo-tyh-service-hotel")//指明服务生产者名称
@RequestMapping("/api/hotel")//此位置的mapping与controller上的mapping是共享全局唯一的,如果这里的名字和controller的路由相同会报错ambiguous mapping
public interface HotelService {
// //无参数无返回值
// @RequestMapping("/test")
// void test();
//基础类型参数
@RequestMapping("/get")
BaseInfoModel get(@RequestParam("id") int id); //自定义类型参数以及泛型返回值
@RequestMapping("/list")
ResponseModel<List<BaseInfoModel>> list(@RequestBody SearchModel search);
}

5、新建controller文件夹,新建HotelController的class用来接收页面调用

import javademo.tyh.model.hotel.BaseInfoModel;
import javademo.tyh.model.hotel.ResponseModel;
import javademo.tyh.model.hotel.SearchModel;
import javademo.tyh.web.hotel.service.HotelService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import java.util.List; @Controller
@RequestMapping("/hotel")
public class HotelController { //自动注入Feign接口对象
@Autowired
HotelService service; @RequestMapping("/get")
public String get(Model model) {
//像调用方法一样调用即可实现服务生产者端的调用
model.addAttribute("model",service.get(1));
return "/hotel/get";
} //直接返回json不写页面了
@ResponseBody
@RequestMapping("/list")
public List<BaseInfoModel> list() {
SearchModel search = new SearchModel();
search.setId(1);
search.setName("taiyonghai");
ResponseModel<List<BaseInfoModel>> result = service.list(search);
return result.getData();
}
}

6、在resources文件夹下建立templates及hotel文件夹,新建get.html页面,用来渲染数据

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>this is /hotel/get</h1> <label th:text="${model.Id}">id</label>
<label th:text="${model.Nickname}">Nickname</label>
<label th:text="${model.UpdateTime}">UpdateTime</label> </body>
</html>

OK,现在启动Eureka注册中心、启动服务生产者、启动服务消费者访问http://localhost:13000/hotel/get就可以看到从service取到的结果了

本应该在这里就完成了,但有时候我们需要在Header头信息中增加些公共内容,在Feign中就可以使用如下方式实现

在消费者这边的service文件夹下新建FeignInterceptor实现RequestInterceptor接口

import feign.RequestInterceptor;
import feign.RequestTemplate;
import org.springframework.stereotype.Component; //使用拦截器添加Header头信息
@Component
public class FeignInterceptor implements RequestInterceptor {
@Override
public void apply(RequestTemplate requestTemplate) {
System.out.println("调用了FeignInterceptor");
requestTemplate.header("taiyonghai", "1111111111111");
}
}

Feign的简单使用就OK了

IDEA项目搭建七——使用Feign简化消费者端操作的更多相关文章

  1. IDEA项目搭建八——使用MybatisPlus简化数据库交互

    一.MybatisPlus简化数据库交互 我们使用Mybatis发现需要在mapper.xml中写很多重复的简单CRUD(增删改查),使用MybatisPlus可以大大简化这部分代码,官方文档http ...

  2. windows下 maven+selenium+testng项目搭建(七)

    Selenium2.47.1 + Maven3.3.9 + TestNG6.8.8 windows准备好以下环境 1. Jdk,环境变量配置 2. maven环境3. eclipse 开发工具 ,ec ...

  3. 从壹开始 [ Nuxt.js ] 之二 || 项目搭建 与 接口API

    前言 哈喽大家周一好,今天的内容比较多,主要就是包括:把前端页面的展示页给搭出来,然后调通接口API,可以添加数据,这两天我也一直在开发,本来想一篇一篇的写,发现可能会比较简单,就索性把项目搭建的过程 ...

  4. SpringCloud---网关概念、Zuul项目搭建(六)

    SpringCloud---网关概念.Zuul项目搭建(六) 一.网关概念 1.什么是路由网关 网关是系统的唯一对外的入口,介于客户端和服务器端之间的中间层,处理非业务功能 提供路由请求.鉴权.监控. ...

  5. SpringCloud(7)---网关概念、Zuul项目搭建

    SpringCloud(7)---网关概念.Zuul项目搭建 一.网关概念 1.什么是路由网关 网关是系统的唯一对外的入口,介于客户端和服务器端之间的中间层,处理非业务功能 提供路由请求.鉴权.监控. ...

  6. 【spring colud】spring cloud微服务项目搭建【spring boot2.0】

    spring cloud微服务项目搭建 =================================== 示例版本: 1.spring boot 2.0版本 2.开发工具 IntellJ IDE ...

  7. dva使用及项目搭建

    一.简介 本文将简单分析dva脚手架的使用及项目搭建过程. 首先,dva是一个基于redux和redux-saga的数据流方案,然后为了简化开发体验,dva还额外内置了react-router和fet ...

  8. SpringCloud(六)之 网关概念、Zuul项目搭建-(利用Zuul 实现鉴权和限流实战)

    一.网关概念 1.什么是路由网关 网关是系统的唯一对外的入口,介于客户端和服务器端之间的中间层,处理非业务功能 提供路由请求.鉴权.监控.缓存.限流等功能.它将"1对N"问题转换成 ...

  9. SpringBoot 项目搭建(详细介绍+案例源码)

    SpringBoot 项目搭建 SpringBoot 项目整合源码 SpringBoot 项目整合 一.项目准备 1.1 快速创建 SpringBoot 项目 1.2 标准项目结构图如下 1.3 添加 ...

随机推荐

  1. 教你怎么看网站是用react搭建的

    概述 SPA和react可以说是web开发的分水岭,我一直在寻找判断网站是普通网站还是SPA抑或是react的方法.今天突然找到一个判断网站是不是react搭建的简便方法.现在记录下来供以后开发时参考 ...

  2. 设置win版vim启动项[利刃篇]

    vim默认启动设置有时不太好,想改一下,但是又不像windows其他软件那样,界面设置后就生效,这里需要手动设置文件才可以,那就赶紧设置一下吧! 修改文件为 vim安装目录/_vimrc 文件,或者在 ...

  3. OpenStack-Ocata版+CentOS7.6 云平台环境搭建 — 6.在计算节点上安装并配置计算服务Nova

    安装和配置计算节点这个章节描述如何在计算节点上安装和配置计算服务. 计算服务支持几种不同的 hypervisors.为了简单起见,这个配置在计算节点上使用 :KVM <kernel-based ...

  4. OpenStack-Ocata版+CentOS7.6 云平台环境搭建 — 3.安装配置OpenStack认证服务(keystone)

    节点配置信息说明: 控制节点:controller: IP:192.168.164.128 hostname&hosts:likeadmin 计算加点:Nova: IP:192.168.164 ...

  5. 第四篇:断路器(Hystrix)

    一.断路器简介. 在微服务架构中,根据业务来拆分成一个个的服务,服务与服务之间可以相互调用(RPC),在Spring Cloud可以用RestTemplate+Ribbon和Feign来调用.为了保证 ...

  6. 初识Telerik for AJAX

    由于项目需要,本人又刚入门.net开发,项目经理介绍了一个.net流行的开发框架telerik.于是我开始慢慢学习了,发现这个控件还是不错的,学习到的内容和初学者一起探讨一下. 1:第一步 什么是te ...

  7. [视频]K8飞刀 WordPress XSS添加管理员 & GetShell 教程

    [视频]K8飞刀 WordPress  XSS添加管理员 & GetShell 教程 https://pan.baidu.com/s/1hq4LsmK

  8. Python日常实践(1)——SQL Prompt的Snippets批量整理

    引言 个人平时在写sql脚本的时候会使用到SQL Prompt这款插件,除了强大的智能提示和格式化sql语句功能,我还喜欢使用Snippets代码段功能.比如我们可以在查下分析器输入ssf后按Tab键 ...

  9. Java RMI HelloWorld

    Java RMI HelloWorld   RMI 远程方法调用. 顾名思义就是可以像调用本地程序方法一样调用远程(其他JVM)的程序方法.   分为3个部分: Stub:中介,代理. 封装了远程对象 ...

  10. 图形数据库Neo4j基本了解

    在深入学习图形数据库之前,首先理解属性图的基本概念.一个属性图是由顶点(Vertex),边(Edge),标签(Lable),关系类型和属性(Property)组成的有向图.顶点也称作节点(Node), ...