feign的簡單執行個體
一、什麼是feign
Feign是Netflix開發的聲明式(目前由Spring在維護)、模闆化的HTTP用戶端, Feign可以幫助我們更快捷、優雅地調用HTTP API。
簡單的來說就是一個遠端調用服務的架構/工具,讓開發者以更少耦合更少代碼更快更相容的方法進行遠端服務調用
二、Feign功能
- 可插拔的注解支援,包括Feign注解和JAX-RS注解;
- 與Ribbon負載均衡器、Hystrix或Sentinel熔斷器無縫內建。
- 支援可插拔的HTTP編碼器和解碼器;
- 支援HTTP請求和響應的壓縮。
三、基本使用
建立spring-cloud-feign項目
項目結構
父:spring-cloud-feign
子子產品1:provider
子子產品2:consumer
添加依賴
整個項目的依賴(由于全寫在了父pom中,是以子依賴無需添加新的依賴)
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-nacos-discovery</artifactId>
<version>2.2.0.RELEASE</version>
</dependency>
提供者:provider
1.提供者的application.yml
server:
port: 8180 //伺服器端口
spring:
application:
name: test-feign-provider //提供者注冊的服務名稱
cloud:
nacos:
discovery:
server-addr: http://(nacos注冊中心ip):8848
cluster-name: ${spring.application.name} //提供者注冊的服務名稱
2.提供者的Application
package com.smart.provider;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
/**
* 添加@EnableDiscoveryClient注冊服務
*/
@SpringBootApplication
@EnableDiscoveryClient
public class ProviderApplication {
public static void main(String[] args) {
SpringApplication.run(ProviderApplication.class);
}
}
3.提供者的Controller
package com.smart.provider.controller;
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;
@RestController
@RequestMapping
public class TestController {
@RequestMapping(value = "/getStr",method = RequestMethod.GET)
public String getStr(@RequestParam("stats") Integer stats){
if (stats==1){
return "對了";
} else {
return "錯了";
}
}
}
注意:@RequestParam(“stats”)一定要加上,否則會報錯
服務消費者:consumer
1.消費者的yml檔案:
server:
port: 8083
spring:
application:
name: service-consumer
cloud:
nacos:
discovery:
server-addr: http://(nacos注冊中心ip):8848
cluster-name: ${spring.application.name}
2.消費者的application
package com.smart.consumer;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients;
/**
* 通過@EnableFeignClients注解開啟對FeignClients的掃描
*/
@EnableFeignClients
@EnableDiscoveryClient
@SpringBootApplication
public class ConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(ConsumerApplication.class);
}
}
3.消費者的dao層
package com.smart.consumer.dao;
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;
@FeignClient("test-feign-provider")
public interface TestFeign {
@RequestMapping(value = "/getStr",method = RequestMethod.GET)
String getStr(@RequestParam("stats") Integer stats);
}
4.消費者的service層和impl
package com.smart.consumer.service;
public interface TestFeignService {
String getTestStr(Integer stats);
}
package com.smart.consumer.service.impl;
import com.smart.consumer.dao.TestFeign;
import com.smart.consumer.service.TestFeignService;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
@Service
public class TestFeignServiceImpl implements TestFeignService {
@Resource
TestFeign testFeign;
@Override
public String getTestStr(Integer stats) {
return testFeign.getStr(stats);
}
}
5.消費者的Controller層
package com.smart.consumer.controller;
import com.smart.consumer.service.TestFeignService;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
@RestController
public class TestFeignController {
@Resource
TestFeignService testFeignService;
@GetMapping("/getStr")
public String getStr(Integer stats){
String testStr = testFeignService.getTestStr(stats);
return testStr;
}
}
測試
分别注冊兩個服務到注冊中心nacos後,用postman測試