日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關咨詢
選擇下列產(chǎn)品馬上在線溝通
服務時間:8:30-17:00
你可能遇到了下面的問題
關閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
聊聊Http服務化改造實踐

而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 List listAll(String name) {
ArrayList list = 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)任中通快遞中間件高級架構師,對消息中間件、Flink有著非常豐富的實踐經(jīng)驗。


網(wǎng)站題目:聊聊Http服務化改造實踐
標題鏈接:http://www.5511xx.com/article/cosodpo.html