内容简介:Reactor-guice 是一个基于 Google Guice 和 Reactor-netty 的 反应式微服务框架 设计为大家喜欢的通过注解来配置路由,性能基于反应式框架的特点,非常的高效。 对于 web 开发常见的 Json, Protobuf, 表单,文件上...
Reactor-guice 是一个基于 Google Guice 和 Reactor-netty 的 反应式微服务框架
设计为大家喜欢的通过注解来配置路由,性能基于反应式框架的特点,非常的高效。
对于 web 开发常见的 Json, Protobuf, 表单,文件上传,websocket ,都是轻松支持
0.0.3 注册注解 @GET @POST @PUT @DELETE @Products @PATH
支持 Websocket 可作为静态文件服
支持对 URI 做 Filter 处理
0.0.5 静态文件目录后默认输出 index.html
支持自选模板引擎,自带Freemark 和 Thymeleaf 处理类
支持自定义Json引擎,自带 Gson 和jackson 的处理类
添加 ModelMap, 注入到 Controlle 的方法,用户模板的变量代入
可以上传文件了
0.0.8 可以 POST 数组
通过返回 Mono.just("redirect:/...") 实现重定向
支持 API 网关模式
修复头信息错误的 BUG
可选返回跨域头信息
0.10 支持输出 Protobuf
BeanParm 可以支持 Form ,Json 或 Protobuf ,将上传的数据自动组织成对象
上传的文件接受类型 byte[] , UploadFile, File
上传文件可以自动保存到指定的目录
0.11 增加自动扫描 Controlle 类和 Service 类
通过扫描完成路由配置和依赖注入,不同手动做额外配置
0.12.1 静态文件的读取塞入到异步中去处理
这个版本是一个稳定的版本
0.12.2 优化 Jar 内读取文件的变量
简化 websocket 的接口
网关模式增加 websocket
0.12.4 增加 Https (0.12.3)
静态文件目录可配置多个
修复上传文件多次后,溢出的情况,补充 FileUpload.release()
修复非 Form POST ,错误的做了 Bytebuf.release()
1. 引入 reactor-guice
maven
<dependency>
<groupId>com.doopp</groupId>
<artifactId>reactor-guice</artifactId>
<version>0.12.4</version>
</dependency>
gradle
compile 'com.doopp:reactor-guice:0.12.4'
2. 创建应用
public static void main(String[] args) throws IOException {
// 载入配置
Properties properties = new Properties();
properties.load(new FileInputStream(args[0]));
String host = properties.getProperty("server.host");
int port = Integer.valueOf(properties.getProperty("server.port"));
// 启动服务
ReactorGuiceServer.create()
.bind(host, port)
.createInjector(
// 方便使用 @Names 来获取配置
binder -> Names.bindProperties(binder, properties),
// 数据库
new MyBatisModule() {
@Override
protected void initialize() {
install(JdbcHelper.MySQL);
bindDataSourceProviderType(HikariDataSourceProvider.class);
bindTransactionFactoryType(JdbcTransactionFactory.class);
addMapperClasses("com.doopp.gauss.app.dao");
// addInterceptorClass(PageInterceptor.class);
}
},
// Redis
new RedisModule(),
// 自定义的配置
new ApplicationModule()
)
// 配置 Json 处理类
.setHttpMessageConverter(new MyGsonHttpMessageConverter())
// 设定自动扫描 Controller 和 Service 的包名,可以配置多个
.basePackages("com.doopp.gauss.app", ...)
// 配置多个静态资源
.addResource("/static/", "/static-public/")
.addResource("/", "/public/")
// https
.setHttps(new File(jksFilePath), jksPassword, jksSecret)
// 目前仅支持通过 URI 来过滤,可以多次 addFilter
.addFilter("/", AppFilter.class)
// 错误信息输出
.printError(true)
.launch();
}
3. 创建 Controller
Controller Example
@Controller
@Path("/api/admin")
public class ExampleController {
@GET
@Path("/json")
@Produces({MediaType.APPLICATION_JSON})
public Mono<Map<String, String>> json() {
return Mono
.just(new HashMap<String, String>())
.map(m -> {
m.put("hi", "five girl");
return m;
});
}
@GET
@Path("/jpeg")
@Produces({"image/jpeg"})
public Mono<ByteBuf> jpeg() {
return HttpClient.create()
.get()
.uri("https://static.cnbetacdn.com/article/2019/0402/6398390c491f650.jpg")
.responseContent()
.aggregate()
.map(ByteBuf::retain);
}
}
WebSocket
@Path("/kreactor/ws")
@Singleton
public class WsTestHandle extends AbstractWebSocketServerHandle {
@Override
public void connected(Channel channel) {
System.out.println(channel.id());
super.connected(channel);
}
@Override
public void onTextMessage(TextWebSocketFrame frame, Channel channel) {
System.out.println(frame.text());
super.onTextMessage(frame, channel);
}
}
Api Gateway 模式
ReactorGuiceServer.create()
.bind(host, port)
.setApiGatewayDispatcher(new MyApiGatewayDispatcher())
.addFilter("/", TestFilter.class)
.launch();
混合的 Api Gateway Model
ReactorGuiceServer.create()
.bind(host, port)
.createInjector(module1, module2, ...)
.setHttpMessageConverter(new JacksonHttpMessageConverter())
.setApiGatewayDispatcher(new MyApiGatewayDispatcher())
.handlePackages("com.doopp.reactor.guice.test")
.addFilter("/", TestFilter.class)
.launch();
表单和文件上传
// Server
@POST
@Path("/test/post-bean")
public Mono<User> testPostBean(@BeanParam User user, @FileParam(value="image", path = "C:\\Users\\koocyton\\Desktop") File[] file) {
return Mono.just(user);
}
// Client Test
@Test
public void testFileUpload() {
String hhe = HttpClient.create()
.post()
.uri("http://127.0.0.1:8083/kreactor/test/post-bean")
.sendForm((req, form) -> form.multipart(true)
.attr("id", "123123121312312")
.attr("account", "account")
.attr("password", "password")
.attr("name", "name")
.file("image", new File("C:\\Users\\koocyton\\Pictures\\cloud.jpg"))
.file("image", new File("C:\\Users\\koocyton\\Pictures\\st.jpg"))
)
.responseSingle((res, content) -> content)
.map(byteBuf -> byteBuf.toString(CharsetUtil.UTF_8))
.block();
System.out.println(hhe);
}
Protobuf
// Server
@POST
@Path("/test/proto-post-bean")
public Mono<Hello> testPostBean(@BeanParam Hello hello) {
return Mono.just(hello);
}
// Test Client
@Test
public void testPostProtobufBean() {
Hello.Builder builder = Hello.newBuilder();
builder.setId(123);
builder.setName("wuyi");
builder.setEmail("wuyi@doopp.com");
ByteBuf buf = Unpooled.wrappedBuffer(builder.build().toByteArray()).retain();
String hhe = HttpClient.create()
.headers(headers -> {
headers.add(HttpHeaderNames.CONTENT_TYPE, "application/x-protobuf");
})
.post()
.uri("http://127.0.0.1:8083/kreactor/test/proto-post-bean")
.send(Flux.just(buf.retain()))
.responseSingle((res, content) -> content)
.map(byteBuf -> byteBuf.toString(CharsetUtil.UTF_8))
.block();
System.out.println(hhe);
}
以上所述就是小编给大家介绍的《反应式微框架 Reactor-Guice 0.12.4 , 可配置静态文件路径,修复文件上传的溢出》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- 分布式微服务架构体系详解
- 中国式微服务架构模拟案例
- Kong 0.11.1 发布, 分布式微服务抽象层
- Redkale 1.8.7 发布,Java分布式微服务
- Redkale 1.8.8 发布,Java 分布式微服务
- Redkale 1.8.8 发布,Java 分布式微服务
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
ASP.NET揭秘
Stephen Walther、汤涛 / 汤涛 / 中国电力出版社 / 2004-8-1 / 95.00元
本书是美国亚马逊网站同类书长期销售冠军,并受到微软ASP.NET小组项目经理Rob Howard的大力推荐,中文版由中科院专家汤涛老师翻译,经典、权威是本书最好的诠释。 本书共分10部分,31章,囊括了在.NET框架下架建ASP.NET应用程序的各个层面。每一章也都不是泛泛而谈理论,而是围绕实际样例代码来组织,让读者马上可以上手,并且加深理解。书中还包含了两个完整的、立即就可以用得......一起来看看 《ASP.NET揭秘》 这本书的介绍吧!