基于Rx-netty和Karyon2的云就绪微服务

Netflix Karyon提供了一个干净的框架来创建可用于云的微服务。 在您的组织中,如果您使用包含Eureka的Netflix OSS堆栈进行服务注册和发现,使用Archaius进行资产管理,那么很可能会使用Karyon创建微服务。

Karyon最近发生了很多变化,我的目的是使用新版本的Karyon记录一个好的样本。 旧的细胞核(称之为Karyon1)是基于JAX-RS 1.0规格与新泽西的实施,细胞核(Karyon2)的新版本仍然支持球衣也鼓励使用RX-的Netty这是一个定制版本的Netty用支持Rx-java 。

话虽如此,让我跳入一个样本。 我对这个样本的目标是创建一个“乒乓”微服务,该服务接受一个“ POST”消息并返回一个“确认”消息。

以下是一个示例请求:

{
"id": "id",
"payload":"Ping"
}

和预期的响应:

{"id":"id","received":"Ping","payload":"Pong"}

第一步是创建一个RequestHandler ,顾名思义,它是一个用于处理传入请求路由的RX-Netty组件:

package org.bk.samplepong.app;import com.fasterxml.jackson.databind.ObjectMapper;
import io.netty.buffer.ByteBuf;
import io.netty.handler.codec.http.HttpMethod;
import io.netty.handler.codec.http.HttpResponseStatus;
import io.reactivex.netty.protocol.http.server.HttpServerRequest;
import io.reactivex.netty.protocol.http.server.HttpServerResponse;
import io.reactivex.netty.protocol.http.server.RequestHandler;
import netflix.karyon.transport.http.health.HealthCheckEndpoint;
import org.bk.samplepong.domain.Message;
import org.bk.samplepong.domain.MessageAcknowledgement;
import rx.Observable;import java.io.IOException;
import java.nio.charset.Charset;public class RxNettyHandler implements RequestHandler<ByteBuf, ByteBuf> {private final String healthCheckUri;private final HealthCheckEndpoint healthCheckEndpoint;private final ObjectMapper objectMapper = new ObjectMapper();public RxNettyHandler(String healthCheckUri, HealthCheckEndpoint healthCheckEndpoint) {this.healthCheckUri = healthCheckUri;this.healthCheckEndpoint = healthCheckEndpoint;}@Overridepublic Observable<Void> handle(HttpServerRequest<ByteBuf> request, HttpServerResponse<ByteBuf> response) {if (request.getUri().startsWith(healthCheckUri)) {return healthCheckEndpoint.handle(request, response);} else if (request.getUri().startsWith("/message") && request.getHttpMethod().equals(HttpMethod.POST)) {return request.getContent().map(byteBuf -> byteBuf.toString(Charset.forName("UTF-8"))).map(s -> {try {Message m = objectMapper.readValue(s, Message.class);return m;} catch (IOException e) {throw new RuntimeException(e);}}).map(m -> new MessageAcknowledgement(m.getId(), m.getPayload(), "Pong")).flatMap(ack -> {try {return response.writeStringAndFlush(objectMapper.writeValueAsString(ack));} catch (Exception e) {response.setStatus(HttpResponseStatus.BAD_REQUEST);return response.close();}});} else {response.setStatus(HttpResponseStatus.NOT_FOUND);return response.close();}}
}

该流程是完全异步的,并由RX-java库在内部进行管理,Java 8 Lambda表达式也有助于使代码简洁。 您将在这里看到的一个问题是路由逻辑(控制器的哪个uri)与实际的控制器逻辑混合在一起,我认为这已得到解决 。

有了这个RequestHandler,就可以使用原始的RX-Netty在独立的Java程序中启动服务器,实质上就是这样,将在端口8080处启动一个端点来处理请求:

public final class RxNettyExample {public static void main(String... args) throws Exception {final ObjectMapper objectMapper = new ObjectMapper();RxNettyHandler handler = new RxNettyHandler();HttpServer<ByteBuf, ByteBuf> server = RxNetty.createHttpServer(8080, handler);server.start();

但是,这是本机的Rx-netty方法,对于支持云的微服务,必须进行一些操作,该服务应在Eureka上注册,并应响应Eureka的运行状况检查,并应该能够使用Archaius加载属性。

因此,对于Karyon2,主程序中的启动看起来有点不同:

package org.bk.samplepong.app;import netflix.adminresources.resources.KaryonWebAdminModule;
import netflix.karyon.Karyon;
import netflix.karyon.KaryonBootstrapModule;
import netflix.karyon.ShutdownModule;
import netflix.karyon.archaius.ArchaiusBootstrapModule;
import netflix.karyon.eureka.KaryonEurekaModule;
import netflix.karyon.servo.KaryonServoModule;
import netflix.karyon.transport.http.health.HealthCheckEndpoint;
import org.bk.samplepong.resource.HealthCheck;public class SamplePongApp {public static void main(String[] args) {HealthCheck healthCheckHandler = new HealthCheck();Karyon.forRequestHandler(8888,new RxNettyHandler("/healthcheck",new HealthCheckEndpoint(healthCheckHandler)),new KaryonBootstrapModule(healthCheckHandler),new ArchaiusBootstrapModule("sample-pong"),KaryonEurekaModule.asBootstrapModule(),Karyon.toBootstrapModule(KaryonWebAdminModule.class),ShutdownModule.asBootstrapModule(),KaryonServoModule.asBootstrapModule()).startAndWaitTillShutdown();}
}

现在它基本上已经可以使用云了,该版本的程序在启动时将在Eureka进行干净注册并公开运行状况检查端点。 它还在端口8077处公开了一套简洁的管理端点。

结论

我希望这对使用Karyon2开发基于Netflix OSS的内容有很好的介绍。 整个示例可在我的github仓库中找到 :https://github.com/bijukunjummen/sample-ping-pong-netflixoss/tree/master/sample-pong。 作为后续,我将展示如何使用spring-cloud开发相同的服务,这是Spring创建微服务的方式。

翻译自: https://www.javacodegeeks.com/2015/06/rx-netty-and-karyon2-based-cloud-ready-microservice.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/358982.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

中软国际 问题一php的优缺点

PHP的优点&#xff1a;  1. 跨平台&#xff0c;性能优越&#xff0c;跟Linux/Unix结合别跟Windows结合性能强45%&#xff0c;并且和很多免费的平台结合非常省钱&#xff0c;比如LAMP(Linux/Apache/Mysql/PHP)或者FAMP(FreeBSD/Apache/Mysql/PHP)结合&#xff0c;或者数据应用…

vue项目安装less_部署vue项目、安装mongodb

一、node运行环境1、npm install -g n 通过npm 全局安装node2、sudo n 8.16.0 设置node版本Password:install : node-v8.16.0mkdir : /usr/local/n/versions/node/8.16.0fetch : https://nodejs.org/dist/v8.16.0/node-v8.16.0-darwin-x64.tar.gz#############################…

电脑正常启动黑屏,安全模式正常启动的解决办法

今天早上起来&#xff0c;打开电脑&#xff0c;输入账号信息进入后发现是黑屏&#xff0c;本以为电脑卡顿等等看&#xff0c;我看还是黑屏就关机重启了几次发现还是黑屏&#xff0c;然后进入安全模式下发现页面能打开&#xff0c;但是我们都知道安全模式只会加载一些必要的程序…

NHibernate实例化类部分属性

NHibernate 为习惯SQL的开发者提供了接口&#xff0c;将查询的结果转变为持久化对象。虽然该方法不是很提倡。 GetCurrentSession().CreateSQLQuery(sql)参数sql就是实际要执行的sql语句。 如果需要将结果转化为持久换对象&#xff0c;那需要提供对象类型。 GetCurrentSession(…

2.4 万余门在线课程免费开放!大量计算机相关课程.(赶紧收藏)

日前,教育部印发指导意见,面向全国高校免费开放全部优质在线课程和虚拟仿真实验教学资源。 截至 2 月 2 日,教育部组织了 22 个在线课程平台制定了多样化在线教学解决方案,免费开放包括 1291 门国家精品在线开放课程和 401 门国家虚拟仿真实验课程在内的在线课程 2.4 万余门…

osgi和spring区别_OSGI和Spring动态模块–简单的Hello World

osgi和spring区别在此姿势中&#xff0c;我们将采用使用OSGi进行的第一个实现&#xff0c;并使用Spring Dynamic Modules改进应用程序。 Spring动态模块&#xff08;Spring Dm&#xff09;使基于OSGi的应用程序的开发更加容易。 这样&#xff0c;服务的部署就容易得多。 您可以…

mysql binary blob区别_SQL中binary 和 varbinary的区别 blob

binary 和 varbinary固定长度 (binary) 的或可变长度 (varbinary) 的 binary 数据类型。binary [ ( n ) ]固定长度的 n 个字节二进制数据。N 必须从 1 到 8,000。存储空间大小为 n4 字节。varbinary [ ( n ) ]n 个字节变长二进制数据。n 必须从 1 到 8,000。存储空间大小为实际…

线上测试bug工具

根据每个公司性质的不同&#xff0c;规模的不同&#xff0c;所用到的bug管理工具也可能不同。你们用的bug管理工具是什么呢&#xff1f; 1. JIRA&#xff08;付费&#xff09; IRA的生产者把JIRA定义为Professional Issue Tracker&#xff0c;即它是一个专业的问题跟踪管理的…

关于bolg

云笔记挺好用的&#xff0c;博客不更了。转载于:https://www.cnblogs.com/usedrosee/p/4434618.html

Java Micro Framework:您无法忽略的新趋势

什么是Java微框架&#xff0c;为什么要使用它们&#xff1f; 每种语言都有权衡。 对于Java&#xff0c;要成为一种安全&#xff0c;经过严格测试&#xff0c;向后兼容的语言&#xff0c;就要在敏捷性和精简性方面做出一些牺牲。 毫无疑问&#xff0c;它有一些冗长和冗长的内容…

springboot mysql时区设置_java/springboot/mysql时区问题解决方案

解决步骤&#xff1a;先理清楚逻辑数据从mysql查出-->进入docker(没容器化跳过)-->进入相应的应用程序(比如java或者框架springboot之类的)-->程序处理完输出返回给前端或者页面-->展示第一步:先查mysql所以先进入mysql控制台&#xff0c;select now(),时区没问题则…

无法获取签名信息,请上传有效包(110506)

此篇文章将要介绍安卓App提交应用商店时遇到的两个小问题的相关介绍&#xff0c;具体代码请看下文 陆陆续续做了一个半月左右的「喵呜天气」终于在今天下午成功提交到应用商店&#xff08;腾讯应用宝&#xff09;。期间遇到两个小问题&#xff0c;记录如下&#xff1a; 1、上…

工作一个月有感

一年前的自己肯定想不到现在的工作内容&#xff0c;那时候的自己还抱着 effective c&#xff0c;刷着 leetcode&#xff0c;准备实习生面试呢。我一直以为自己毕业后要做 c 服务器端开发&#xff0c;而现在已与当初的想法越走越远了&#xff0c;我把书架上 c 的书收了起来&…

mysql 数据如何存储,MySQL如何存储数据

I looked around google but didnt find any good answers. Does it store the data in one big file? What methods does it use to make data access quicker them just reading and writing to a regular file?解决方案Does it store the data in one big file?Some DBMS…

openshift_红帽Openshift:入门–云中的Java EE6

openshift现在有一段时间&#xff0c;我正在研究“云”。 研究它的功能&#xff0c;它可以做什么&#xff0c;为什么我们应该切换到“云”&#xff0c;进行交谈&#xff0c;与Realmaolmen的云专家maartenballiauw等人交谈。 我已经在Google App Engine&#xff08;用于Java&…

【APICloud系列|10】最新苹果APP上架App Store流程(超详细)

2018最新整理iOS app上架app详细教程 上架iOS需要一个付费688的开发者账号,还没有的话申请一个或者借用。 申请苹果开发者账号教程 上架App Store之前是先安装到苹果手机测试调试好,app能正常运行再上架

.Net面试经验,从北京到杭州

首先简单说下&#xff0c;本人小本&#xff0c;目前大四软件工程专业&#xff0c;大三阴差阳错地选了.Net方向&#xff0c;也是从大三开始接触.Net。自认为在学生中.net基础还可以&#xff0c;嘿嘿&#xff0c;吹一下。 大四第一学期学校安排去北京培训&#xff0c;培训了两个月…

proxifier访问https错误_教你实现IE访问https网站不出错方法

不同的系统出现的问题是不一样的&#xff0c;有小伙伴在电脑账打开我们的网站的时候发现不能正常的打开我们的电脑出现&#xff0c;是否只查看安全传送的网页内容的错误的提示&#xff0c;那我们遇到这个问题应该怎么处理访问https网站呢&#xff0c;今天小编就来跟大家分享一下…

Gradle入门:集成测试

因为Java项目的标准项目布局仅定义了一个测试目录&#xff08; src / test &#xff09;&#xff0c;所以我们没有将集成测试添加到Gradle构建中的标准方法。 如果要使用标准项目布局&#xff0c;则可以使用以下选项之一将集成测试添加到Gradle构建中&#xff1a; 我们可以将…

【APICloud系列|11】使用APPuploader申请ios开发证书及ios发布证书教程

开发证书用于app测试。申请ios开发证书 发布证书用于上架。ios发布证书 我开发的APP使用APICloud,简单走一下编译的流程&#xff0c;然后直接上架到APP store.完整的开发&#xff0c;window电脑&#xff0c;安卓手机&#xff0c;苹果手机&#xff0c;mac电脑还是很有必要的。…