IDEA项目搭建七——使用Feign简化消费者端操作
一、簡(jiǎn)介
我們可以看到上一篇文章的消費(fèi)者這邊調(diào)用Service時(shí)比較麻煩,所以我們可以使用Feign來(lái)簡(jiǎn)化這部分操作,它底層也是使用Ribbon實(shí)現(xiàn)的只是Ribbon支持HTTP和TCP兩種通信協(xié)議,而Feign只支持HTTP一種,同樣支持負(fù)載均衡,所以能滿(mǎn)足90%以上的需求了。
二、搭建生產(chǎn)者模塊
其實(shí)這部分是通用的,對(duì)于消費(fèi)者這邊使用什么Client并沒(méi)有影響,Eureka還是使用之前搭建好的,生產(chǎn)者模塊也用搭建好的,我們新建一個(gè)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 {//自動(dòng)注入請(qǐng)求對(duì)象,查看header信息 @AutowiredHttpServletRequest request;@AutowiredHotelService 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("參數(shù)為:" + id);return service.get(id);}//設(shè)置參數(shù)為@RequestBody可以自動(dòng)序列化為對(duì)象 @ResponseBody@RequestMapping("/list")public ResponseModel<List<BaseInfoModel>> list(@RequestBody SearchModel search) {System.out.println("參數(shù)為:" + search.getName());List<BaseInfoModel> list = service.list();ResponseModel<List<BaseInfoModel>> respModel = new ResponseModel<>();respModel.setCode("000000");respModel.setMsg("操作成功");respModel.setData(list);return respModel;} }添加通用Model實(shí)體,同樣不生成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; }??
?三、搭建消費(fèi)者模塊——Feign
還是創(chuàng)建一個(gè)Maven模塊,看一下我的項(xiàng)目結(jié)構(gòu)
??
1、修改pom.xml文件,增加對(duì)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配置文件,并修改內(nèi)容如下
#設(shè)置自己的程序名稱(chēng) spring:application:name: javademo-tyh-web-hotel#thymeleaf 配置 thymeleaf:encoding: UTF-8prefix: classpath:/templatescache: false #服務(wù)注冊(cè)中心地址(剛剛搭建的Eureka Server的地址) eureka:client:#是否向服務(wù)中心注冊(cè)自己register-with-eureka: false#設(shè)置eureka服務(wù)中心的地址service-url:defaultZone: http://localhost:11000/eureka #設(shè)置自己?jiǎn)?dòng)的端口 server:port: 13000?3、修改main()方法的類(lèi),增加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用來(lái)執(zhí)行Feign向后端服務(wù)生產(chǎn)者的調(diào)用,指明服務(wù)生產(chǎn)者名稱(chēng),接口方法指明具體的服務(wù)路由,這種方式比Ribbon簡(jiǎn)單很多,而且更直觀(guān)更像調(diào)用后臺(tái)方法
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")//指明服務(wù)生產(chǎn)者名稱(chēng) @RequestMapping("/api/hotel")//此位置的mapping與controller上的mapping是共享全局唯一的,如果這里的名字和controller的路由相同會(huì)報(bào)錯(cuò)ambiguous mapping public interface HotelService { // //無(wú)參數(shù)無(wú)返回值 // @RequestMapping("/test") // void test();//基礎(chǔ)類(lèi)型參數(shù)@RequestMapping("/get")BaseInfoModel get(@RequestParam("id") int id);//自定義類(lèi)型參數(shù)以及泛型返回值@RequestMapping("/list")ResponseModel<List<BaseInfoModel>> list(@RequestBody SearchModel search); }??5、新建controller文件夾,新建HotelController的class用來(lái)接收頁(yè)面調(diào)用
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 {//自動(dòng)注入Feign接口對(duì)象 @AutowiredHotelService service;@RequestMapping("/get")public String get(Model model) {//像調(diào)用方法一樣調(diào)用即可實(shí)現(xiàn)服務(wù)生產(chǎn)者端的調(diào)用model.addAttribute("model",service.get(1));return "/hotel/get";}//直接返回json不寫(xiě)頁(yè)面了 @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頁(yè)面,用來(lái)渲染數(shù)據(jù)
<!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,現(xiàn)在啟動(dòng)Eureka注冊(cè)中心、啟動(dòng)服務(wù)生產(chǎn)者、啟動(dòng)服務(wù)消費(fèi)者訪(fǎng)問(wèn)http://localhost:13000/hotel/get就可以看到從service取到的結(jié)果了
本應(yīng)該在這里就完成了,但有時(shí)候我們需要在Header頭信息中增加些公共內(nèi)容,在Feign中就可以使用如下方式實(shí)現(xiàn)
在消費(fèi)者這邊的service文件夾下新建FeignInterceptor實(shí)現(xiàn)RequestInterceptor接口
import feign.RequestInterceptor; import feign.RequestTemplate; import org.springframework.stereotype.Component;//使用攔截器添加Header頭信息 @Component public class FeignInterceptor implements RequestInterceptor {@Overridepublic void apply(RequestTemplate requestTemplate) {System.out.println("調(diào)用了FeignInterceptor");requestTemplate.header("taiyonghai", "1111111111111");} }?Feign的簡(jiǎn)單使用就OK了
?
轉(zhuǎn)載于:https://www.cnblogs.com/taiyonghai/p/9306244.html
總結(jié)
以上是生活随笔為你收集整理的IDEA项目搭建七——使用Feign简化消费者端操作的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Android开发--Service和A
- 下一篇: 史上最简单的SpringCloud教程