首頁 > 軟體

Feign如何解決服務之間呼叫傳遞token

2022-03-15 16:03:09

解決服務之間呼叫傳遞token

現在的微服務基本就是SpringSecurity+Oauth2做的授權和認證,假如多個服務直接要通過Fegin來呼叫,會報錯401

  • a、有做許可權處理的服務介面直接呼叫會造成呼叫時出現http 401未授權的錯誤,繼而導致最終服務的http 500內部伺服器錯誤
  • b、解決方式:最方便的就是往請求頭裡加上token,一起帶過去;

Feign有提供一個介面RequestInterceptor

只要實現這個介面,簡單做一些處理,比如說我們驗證請求頭的token叫Access-Token,我們就先取出當前請求的token,然後放到feign請求頭上;

public class FeignConfig implements RequestInterceptor {
        @Override
        public void apply(RequestTemplate requestTemplate) {
            ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
            HttpServletRequest request = attributes.getRequest();
            //新增token
            requestTemplate.header(HttpHeaders.AUTHORIZATION, request.getHeader(HttpHeaders.AUTHORIZATION));
        }
    }

呼叫方式

    @FeignClient(name = "qtjuaa", configuration = FeignConfig.class)
    public interface UaaClient {
        @RequestMapping(value = "/api/test", method= RequestMethod.GET)
        String test();
    }

Feign呼叫服務各種坑處理

編寫被呼叫服務

@RefreshScope
@RestController
public class XXXController extends BaseController implements IndicatorsFeignApi{
	@Resource
	private XXXService xxx;
	@Override
	public Wrapper<CommonVo> getXXXX(@RequestBody CommonDto commonDto) {
		try {
			CommonVo vo = xxx.getdata(commonDto);
			return WrapMapper.ok(vo);
		}catch(Exception e) {
			e.printStackTrace();
			return WrapMapper.error("系統異常,請聯絡管理員!");
		}
	}
}
//Service不進行展示,注意引數傳遞至service層時要加入註解@RequestBody等才能獲取引數

在組態檔新增feign相關設定

編寫呼叫api

pom檔案中新增相關依賴

org.springframework.cloud
spring-cloud-starter-hystrix
org.springframework.cloud
spring-cloud-starter-netflix-hystrix-dashboard

呼叫Api

@FeignClient(value = "被呼叫服務名")
public interface IndicatorsFeignApi {
	
	@PostMapping(value = "/api/getXXXX",consumes="application/json", headers = {"Accept=application/json", "Content-Type=application/json"})
	Wrapper<CommonVo> getXXXX(@RequestBody CommonDto commonDto);	
}

Feign呼叫錯誤處理,發生相關錯誤是會跳轉至fallback處理

@Component
public class IndicatorsFeignApiHystrix implements IndicatorsFeignApi {
	@Override
	public Wrapper<CommonVo> getXXXX(CommonDto commonDto) {
		System.out.println("=====呼叫服務獲資料發生異常======");
		return null;
	}
}

當啟用fallback後,有些報錯不會列印在控制檯上,這時可以修改設定中的

feign:
  hystrix:
    enabled: true

將enabled改為false,錯誤發生後將不會跳轉fallback。

此處有一個坑,當時呼叫的時候服務是可以呼叫成功的,但是有一個報錯: 

Could not extract response: no suitable HttpMessageConverter found for response type [XXXX] and content type [text/html;charset=UTF-8]

貌似是返回資料的編碼與接收實體類不一樣,導致報錯。加上headers = {"Accept=application/json", "Content-Type=application/json"}解決了相關問題.

編寫使用者端服務

//serviceImp層
   @Autowired
    private IndicatorsFeignApi api;//宣告呼叫api
    
    @Override
    public CommonVo getXXX(CommonDto commonDto) {
        Wrapper<CommonVo> result =   api.getXXXX(commonDto);//服務呼叫
        if(result!=null) {
            return result.getResult();
        }else {
            return new CommonVo();
        }
    }

以上為個人經驗,希望能給大家一個參考,也希望大家多多支援it145.com。


IT145.com E-mail:sddin#qq.com