wordpress 超级搜索,海淀区seo招聘信息,网站开发的私活,个人计算机做服务器建网站在微服务架构体系中远程RPC调用主要包括Dubbo与Http调用两个大类#xff0c;由于Dubbo拥有服务注册中心#xff0c;并且起服务的命名非常规范#xff0c;使用包名.类名.方法名进行描述。
而http调用通常都是使用httpclient等相关类库#xff0c;这些在使用上并没有问题由于Dubbo拥有服务注册中心并且起服务的命名非常规范使用包名.类名.方法名进行描述。
而http调用通常都是使用httpclient等相关类库这些在使用上并没有问题但API都是分散在整个工程的各个地方如果HTTP调用也可以使用类似Dubbo服务的表示方法采用声明式定义就好了。
在开源的世界中只有想不到没有找不到为了解决Feign的声明式服务化管理Feign框架应运而生本文主要介绍如何使用Feign实现Http服务声明化管理与调用。
1.什么是Feign
Feign是一个http请求调用的轻量级框架可以以Java接口注解的方式调用Http请求。Feign通过注解将请求模板化当实际调用的时候传入参数根据参数再应用到请求上进而转化成真正的请求封装了http调用流程。
2、快速入门实例
2.1定义客户端
首先要引入Feign的maven依赖如下图所示 dependencygroupIdcom.netflix.feign/groupIdartifactIdfeign-core/artifactIdversion8.18.0/version/dependency
2.2 定义服务调用API(类似Dubbo API)
服务调用的API声明代码如下所示
FeignClient
public interface HelloControllerApi {RequestLine(GET /api/hello?name{name})String hello(Param(value name) String name);
}
这里的要点是使用FeignClient进行声明。声明后就可以通过HelloControllerApi进行远程HTTP调用示例代码如下
public class HelloControllerApiTest {private HelloControllerApi service;Beforepublic 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);}Testpublic void hello(){// 调用http://127.0.0.1:8080/api/hello?nameworld 的http接口System.out.println(service.hello(world));}}
当然需要在调用方的启动类上增加EnableFeignClients(defaultConfiguration FeignConfiguration.class)注解。
2.3定义服务端
服务端与Feign并无关系主要按照API的方式实现即可服务端实现代码如下所示
Controller
RequestMapping(value api)
public class HelloController {RequestMapping(value /hello, method {RequestMethod.GET})ResponseBodypublic 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.实现签名校验
上述只是简单实用Feign,接下来以实现签名校验为例展示Feign的扩展机制。
签名验证是最常见的安全机制首先在客户端定义一个签名拦截器用于生成签名信息示范代码如下图所示
public class AuthRequestInterceptor implements feign.RequestInterceptor {private TokenService tokenService;public AuthRequestInterceptor(TokenService tokenService) {this.tokenService tokenService;}Overridepublic void apply(RequestTemplate template) {template.header(token, tokenService.getToken());}}
并且在Feign的全局配置文件中创建对应的拦截器示例代码如下
public class FeignConfiguration {Beanpublic RequestInterceptor authRequestInterceptor(ResourceIdentity resourceIdentity) {AuthRequestInterceptor authRequestInterceptor new AuthRequestInterceptor(resourceIdentity);authRequestInterceptor.setErrorEncodeType(errorEncodeType);return authRequestInterceptor;}
}
同时在服务端获取token并对token进行校验示例代码如下
Component
public class AuthFilter implements Filter {Autowiredprivate TokenService tokeService;Overridepublic 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
上面的示例虽然实现了服务接口的声明式管理但调用端、客户端并没有显示的约束关系接下来展示如何使用客户端、服务端使用继承方式定义服务调用API。
例如要实现如下图的效果 原生的Feign无法实现该效果我们需要使用OpenFeign类库两者之间的对比如下图所示 接下来详细介绍具体实现方法。
4.1 提取公共API
首先使用一个模块定义公共API,需要引入maven依赖代码示例如下所示 dependenciesdependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId/dependency/dependencies
接下来定义公共的服务接口客户端、服务端都需要实现该接口公共服务端接口定义如下
public interface IUserController {RequestMapping(value user/list-all, method {RequestMethod.GET})ListString listAll(RequestParam String name);
}
4.2 服务端实现公共API
首先需要添加相应的maven依赖代码如下
dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId/dependencydependencygroupIdcom.vhicool/groupIdartifactIdfeign-api/artifactIdversion1.0-SNAPSHOT/versionscopecompile/scope/dependency
服务端采用继承方式实现具体代码如下所示
Controller
RequestMapping
public class UserController implements IUserController {OverrideResponseBodypublic ListString listAll(String name) {ArrayListString list new ArrayList();list.add(达菲);list.add(olu);list.add(name);return list;}
}
4.3 客户端实现公共API
客户端首先同样需要增加相应的依赖具体代码如下所示
dependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-starter-openfeign/artifactIdversion2.1.5.RELEASE/version/dependencydependencygroupIdjunit/groupIdartifactIdjunit/artifactIdversion4.12/versionscopecompile/scope/dependencydependencygroupIdcom.vhicool/groupIdartifactIdfeign-api/artifactIdversion1.0-SNAPSHOT/versionscopecompile/scope/dependency
客户端服务调用类需要继承公共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配置全局参数具体如下
Configuration
public class FeignConfiguration {/*** 请求超时时间* return*/Beanpublic Request.Options options() {return new Request.Options(2000, 3500);}//拦截器等定义
}
接下来客户端就可以用如下方式进行调用
RunWith(SpringRunner.class)
SpringBootTest
public class UserControllerTest {Autowiredprivate UserApi userApi;Testpublic void listAll() {System.out.println(userApi.listAll(饼饼));}
}
当前项目编译的jar包类也已经被替换成我们自定义的类目标达成。 善用工具
成功的前端工程师很会善用工具这些年低代码概念开始流行像国外的 Mendix国内的 JNPF这种新型的开发方式图形化的拖拉拽配置界面并兼容了自定义的组件、代码扩展确实在 B 端后台管理类网站建设中很大程度上的提升了效率。
开源地址JNPF体验中心
代码量少系统的稳定性和易调整性都会得到一定的保障。基于代码生成器可一站式开发多端使用 Web、Android、IOS、微信小程序。代码自动生成后可以下载本地进行二次开发有效提高整体开发效率。同时支持多种云环境部署、本地部署给予最大的安全保障可以快速搭建适合自身应用场景的产品。