新聞中心
而http調(diào)用通常都是使用httpclient等相關類庫,這些在使用上并沒有問題,但API都是分散在整個工程的各個地方,如果HTTP調(diào)用也可以使用類似Dubbo服務的表示方法,采用聲明式定義就好了。

10年積累的成都做網(wǎng)站、網(wǎng)站設計、外貿(mào)營銷網(wǎng)站建設經(jīng)驗,可以快速應對客戶對網(wǎng)站的新想法和需求。提供各種問題對應的解決方案。讓選擇我們的客戶得到更好、更有力的網(wǎng)絡服務。我雖然不認識你,你也不認識我。但先網(wǎng)站設計后付款的網(wǎng)站建設流程,更有天峻免費網(wǎng)站建設讓你可以放心的選擇與我們合作。
在開源的世界中只有想不到,沒有找不到,為了解決Feign的聲明式服務化管理,F(xiàn)eign框架應運而生,本文主要介紹如何使用Feign實現(xiàn)Http服務聲明化管理與調(diào)用。
1.什么是Feign
Feign是一個http請求調(diào)用的輕量級框架,可以以Java接口注解的方式調(diào)用Http請求。Feign通過注解,將請求模板化,當實際調(diào)用的時候,傳入?yún)?shù),根據(jù)參數(shù)再應用到請求上,進而轉(zhuǎn)化成真正的請求,封裝了http調(diào)用流程。
2、快速入門實例
2.1定義客戶端
首先要引入Feign的maven依賴,如下圖所示:
com.netflix.feign
feign-core
8.18.0
2.2 定義服務調(diào)用API(類似Dubbo API)
服務調(diào)用的API聲明代碼如下所示:
@FeignClient
public interface HelloControllerApi {
@RequestLine("GET /api/hello?name={name}")
String hello(@Param(value = "name") String name);
}
這里的要點是使用@FeignClient進行聲明。聲明后就可以通過HelloControllerApi進行遠程HTTP調(diào)用,示例代碼如下:
public class HelloControllerApiTest {
private HelloControllerApi service;
@Before
public void before(){
service = Feign.builder()
.options(new Request.Options(1000, 3500))
.retryer(new Retryer.Default(5000, 5000, 3))
.target(HelloControllerApi.class, "http://127.0.0.1:8080");
}
@Test
public void hello(){
// 調(diào)用http://127.0.0.1:8080/api/hello?name=world 的http接口
System.out.println(service.hello("world"));
}
}當然需要在調(diào)用方的啟動類上增加@EnableFeignClients(defaultConfiguration = FeignConfiguration.class)注解。
2.3定義服務端
服務端與Feign并無關系,主要按照API的方式實現(xiàn)即可,服務端實現(xiàn)代碼如下所示:
@Controller
@RequestMapping(value = "api")
public class HelloController {
@RequestMapping(value = "/hello", method = {RequestMethod.GET})
@ResponseBody
public String list(@RequestParam String name) {
return "Hello " + name;
}
}
//啟動類
@SpringBootApplication(scanBasePackages = {"com.vhicool.manager"})
public class ManagerApplication {
public static void main(String[] args) {
SpringApplication.run(ManagerApplication.class, args);
}
}
3.實現(xiàn)簽名校驗
上述只是簡單實用Feign,接下來以實現(xiàn)簽名校驗為例展示Feign的擴展機制。
簽名驗證是最常見的安全機制,首先在客戶端定義一個簽名攔截器,用于生成簽名信息,示范代碼如下圖所示:
public class AuthRequestInterceptor implements feign.RequestInterceptor {
private TokenService tokenService;
public AuthRequestInterceptor(TokenService tokenService) {
this.tokenService = tokenService;
}
@Override
public void apply(RequestTemplate template) {
template.header("token", tokenService.getToken());
}
}并且在Feign的全局配置文件中創(chuàng)建對應的攔截器,示例代碼如下:
public class FeignConfiguration {
@Bean
public RequestInterceptor authRequestInterceptor(ResourceIdentity resourceIdentity) {
AuthRequestInterceptor authRequestInterceptor = new AuthRequestInterceptor(resourceIdentity);
authRequestInterceptor.setErrorEncodeType(errorEncodeType);
return authRequestInterceptor;
}
}同時在服務端獲取token并對token進行校驗,示例代碼如下:
@Component
public class AuthFilter implements Filter {
@Autowired
private TokenService tokeService;
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
String remoteToken = ((HttpServletRequest) servletRequest).getHeader("token");
if(!tokeService.valid(token)) {
//異常處理邏輯
return;
}
filterChain.doFilter(servletRequest, servletResponse);
}
}
4.服務端自動生成Feign
上面的示例雖然實現(xiàn)了服務接口的聲明式管理,但調(diào)用端、客戶端并沒有顯示的約束關系,接下來展示如何使用客戶端、服務端使用繼承方式定義服務調(diào)用API。
例如要實現(xiàn)如下圖的效果:
原生的Feign無法實現(xiàn)該效果,我們需要使用OpenFeign類庫,兩者之間的對比如下圖所示:
接下來詳細介紹具體實現(xiàn)方法。
4.1 提取公共API
首先使用一個模塊定義公共API,需要引入maven依賴,代碼示例如下所示:
org.springframework.boot
spring-boot-starter-web
接下來定義公共的服務接口,客戶端、服務端都需要實現(xiàn)該接口,公共服務端接口定義如下:
public interface IUserController {
@RequestMapping(value = "user/list-all", method = {RequestMethod.GET})
List listAll(@RequestParam String name);
} 4.2 服務端實現(xiàn)公共API
首先需要添加相應的maven依賴,代碼如下:
org.springframework.boot
spring-boot-starter-web
com.vhicool
feign-api
1.0-SNAPSHOT
compile
服務端采用繼承方式實現(xiàn),具體代碼如下所示:
@Controller
@RequestMapping
public class UserController implements IUserController {
@Override
@ResponseBody
public ListlistAll(String name) {
ArrayListlist = new ArrayList<>();
list.add("達菲");
list.add("olu");
list.add(name);
return list;
}
}
4.3 客戶端實現(xiàn)公共API
客戶端首先同樣需要增加相應的依賴,具體代碼如下所示:
org.springframework.cloud
spring-cloud-starter-openfeign
2.1.5.RELEASE
junit
junit
4.12
compile
com.vhicool
feign-api
1.0-SNAPSHOT
compile
客戶端服務調(diào)用類需要繼承公共API:
@FeignClient(value = "user", url = "http://localhost:8080")
public interface UserApi extends IUserController {
}
同時客戶端啟動類需要增加@EnableFeignClients注解,具體示例代碼如下所示:
@SpringBootApplication
@EnableFeignClients
public class ManagerApplication {
public static void main(String[] args) {
SpringApplication.run(ManagerApplication.class, args);
}
}
同樣基于Springboot編程方式,可以為Feign配置全局參數(shù),具體如下:
@Configuration
public class FeignConfiguration {
/**
* 請求超時時間
* @return
*/
@Bean
public Request.Options options() {
return new Request.Options(2000, 3500);
}
//攔截器等定義
}
接下來客戶端就可以用如下方式進行調(diào)用:
@RunWith(SpringRunner.class)
@SpringBootTest
public class UserControllerTest {
@Autowired
private UserApi userApi;
@Test
public void listAll() {
System.out.println(userApi.listAll("餅餅"));
}
}
時,當前項目編譯的jar包,類也已經(jīng)被替換成我們自定義的類,目標達成。
作者介紹:李大偉,現(xiàn)任中通快遞中間件高級架構(gòu)師,對消息中間件、Flink有著非常豐富的實踐經(jīng)驗。
網(wǎng)頁標題:聊聊Http服務化改造實踐
網(wǎng)站地址:http://www.fisionsoft.com.cn/article/cosodpo.html


咨詢
建站咨詢
