Http服务化改造实践(二)

WilliamGates
发布于 2022-6-21 16:17
9211浏览
0收藏

 

3、实现签名校验

 

上述只是简单实用Feign,接下来以实现签名校验为例展示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());
 }

}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.

 

并且在Feign的全局配置文件中创建对应的拦截器,示例代码如下:

public class FeignConfiguration {
  @Bean
 public RequestInterceptor authRequestInterceptor(ResourceIdentity resourceIdentity) {
  AuthRequestInterceptor authRequestInterceptor = new AuthRequestInterceptor(resourceIdentity);
  authRequestInterceptor.setErrorEncodeType(errorEncodeType);
  return authRequestInterceptor;
 }
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.

 

同时在服务端获取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);
 }
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.

 

4、服务端自动生成Feign

 

上面的示例虽然实现了服务接口的声明式管理,但调用端、客户端并没有显示的约束关系,接下来展示如何使用客户端、服务端使用继承方式定义服务调用API。

 

例如要实现如下图的效果:

Http服务化改造实践(二)-鸿蒙开发者社区

原生的Feign无法实现该效果,我们需要使用OpenFeign类库,两者之间的对比如下图所示:

Http服务化改造实践(二)-鸿蒙开发者社区

接下来详细介绍具体实现方法。

 

4.1 提取公共API
首先使用一个模块定义公共API,需要引入maven依赖,代码示例如下所示:

 <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    </dependencies>
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.

 

接下来定义公共的服务接口,客户端、服务端都需要实现该接口,公共服务端接口定义如下:

public interface IUserController {
 @RequestMapping(value = "user/list-all", method = {RequestMethod.GET})
 List<String> listAll(@RequestParam String name);
}
  • 1.
  • 2.
  • 3.
  • 4.

 

文章转自公众号:中间件兴趣圈

标签
已于2022-6-21 16:17:05修改
收藏
回复
举报
回复
    相关推荐