python 微服务框架_Java 8 微服务框架 Redkale

Redkale 介绍

Redkale (中文名: 红菜苔,湖北武汉的一种特产蔬菜) 是基于Java 8全新的微服务框架, 包含HTTP、WebSocket、TCP/UDP、数据序列化、数据缓存、依赖注入等功能。

本框架致力于简化集中式和微服务架构的开发,在增强开发敏捷性的同时保持高性能。

RedKale 有如下主要特点:

1、大量使用Java 8新特性(接口默认值、Stream、Lambda、JDk8内置的ASM等)

2、提供HTTP服务,同时内置JSON功能与限时缓存功能

3、TCP层完全使用NIO.2,并统一TCP与UDP的接口

4、提供分布式与集中式部署的无缝切换

5、提供类似JPA功能,并包含数据缓存自动同步与简洁的数据层操作接口

6、可以动态修改已依赖注入的资源

3772a7e19854eb98ee4c8f15e9b3ccbb.png

设计理念

作为一个全新的微服务框架,不仅是使用了Java8的新语法,更多是设计上与主流框架有所不同。Redkale是按组件形式设计的,而非以容器为主,几乎每个子包都是能提供独立功能的组件。如Tomcat是按容器设计的,所有web资源/配置由Tomcat控制,开发者很能难控制到Tomcat内部,而Redkale的HTTP服务只是个组件,开发者既可以自己启动和配置HttpServer,也可以把Redkale当成容器通过Redkale进程来初始化服务。Spring的Ioc容器也是如此,Redkale提供的依赖注入仅通过ResouceFactory一个类来控制,非常轻量,而且也可以动态更改已注入的资源。Spring提倡控制反转思想,偏偏自身的容器却让开发者很难控制。Redkale是一个既能以组件形式也能以容器形式存在的框架。从整体上看,Redkale的架构分两层:接口和默认实现。若开发者不想使用Redkale内置的HTTP服务而使用符合JavaEE规范的HttpServlet, 可以采用自定义协议基于JSR 340(Servlet 3.1)来实现自己的HTTP服务;若开发者想使用Hibernate作为数据库操作,可以写一个自己的DataSource实现类;JSON的序列化和反序列化也可以使用第三方的实现。这其实包含了控制反转的思想,让框架里的零件可以让开发者控制。

与主流框架比,功能上Redkale显得很简单,这也是Redkale的一个特点并非不足,从一个良好的设计习惯或架构上来看,有些常用功能是不需要提供的,比如Redkale的HTTP服务不支持HTTPS和JSP,HTTPS比HTTP多了一层加密解密,这种密集的数字计算不是Java的专长,同时一个稍好的提供HTTP服务的架构不会将Java动态服务器放在最前端,通常前面会放nginx或apache,除了负载均衡还能静动分离,既然Java服务器前面有C写的服务器,那么HTTPS的加解密就应该交给前面的服务器处理。Redkale再提供HTTPS服务就显得鸡肋。JSP其实算是一个落后的技术,现在是一个多样化终端的时代,终端不只局限于桌面程序和PC浏览器,还有原生App、混合式App、微信端、移动H5、提供第三方接口等各种形式的终端,这些都不是JSP能兼顾的,而HTTP+JSON作为通用性接口可以避免重复开发,模版引擎的功能加上各种强大的JS框架足以取代JSP(如果初级程序员还花大量时间去学习基于JSP的Struts或Spring MVC框架,就有点跟不上时代了)。Redkale在功能上做了筛选,不会只因为迎合主流而提供,而是以良好的设计思想为指导。这也是Redkale很重要的一个思想。

亮点一. 序列化与反序列化

Convert包是RedKale内一个独立的组件, 用于数据的序列化与反序列化。包分三块:基本包、JSON包、BSON(Binary Stream Object Notation)包。基本包可以用于扩展其他序列化格式(如: XML),其JSON性能是其他任何JSON框架不能媲美的,对于非常规的POJO类也提供了方便的自定义接口。BSON用于数据的二进制序列化与反序列 化,支持很复杂的泛型数据,是SNCP协议的基础。

亮点二. 轻量级HTTP

Redkale 的HTTP是基于异步NIO.2实现的,所提供的HttpResponse的输出接口也是异步的,因此并不遵循JSR 340规范(Servlet 3.1)且也没有实现JSP规范。 HTTP只提供四个对象:HttpContext、HttpRequest、HttpResponse、HttpServlet。 传统Session则由数据层实现。RedKale提倡HTTP+JSON接口(无论网站、PC客户端、APP移动端、第三方接口都可使用统一接口), 因此HTTP层内置了JSON序列化与反序列化接口,同时内置HTTP缓存机制。

Redkale 的WebSocket服务接口不同于JSR 340(Servlet 3.1), 除了提供基本的WebSocket功能, 还提供分布式与集中式部署, 当部署多个WebSocket进程时,通过配置文件可以实现WebSocket之间连接信息的数据同步。

亮点三. SNCP协议

SNCP(Service Node Communicate Protocol)是Redkale独有的协议, 类似RMI与WebService的功能结合,主要用于进程间的数据传输。使用者通过配置文件可以轻易的将Service由本地模式变成远程模式。远程模式Service使用SNCP协议与其他进程的Service通信。使用者无需对远程通信接口使用类似Mina的第三方包自行开发。SNCP是RedKale的核心功能,其微服务架构都是基于本地模式Service和远程模式Service。

亮点四. DataSource

Redkale提供DataSource类对数据层进行操作,其功能类似JPA+Memcached。最 大程度的简化数据层的操作,免去SQL/JPQL语句的编写。同时提供过滤查询与JavaBean的结合、读写分离、数据库热切换、本地/远程部署、进程 间缓存自动同步等功能。

详情请访问: http://redkale.org

Etcd是一个高可用的键值存储系统,用于分布式系统中的服务发现和配置共享。而gRPC则是一种高性能、开源和通用的RPC框架,可以在任何环境中连接多种语言开发的应用程序。将Etcd与gRPC结合起来,可以实现高效的微服务治理。 在Python中,可以使用etcd3库与Etcd进行通信,使用grpc库实现gRPC服务。具体实现步骤如下: 1. 安装etcd3和grpc库 ```sh pip install etcd3 grpcio grpcio-tools ``` 2. 启动Etcd服务 可以使用Docker容器启动Etcd服务: ```sh docker run --rm -p 2379:2379 -p 2380:2380 --name etcd quay.io/coreos/etcd:v3.3.8 /usr/local/bin/etcd --advertise-client-urls http://0.0.0.0:2379 --listen-client-urls http://0.0.0.0:2379 --listen-peer-urls http://0.0.0.0:2380 ``` 3. 编写服务代码 首先,定义.proto文件,声明gRPC服务: ```protobuf syntax = "proto3"; package helloworld; service Greeter { rpc SayHello (HelloRequest) returns (HelloReply) {} } message HelloRequest { string name = 1; } message HelloReply { string message = 1; } ``` 然后,使用grpc_tools.protoc工具生成Python代码: ```sh python -m grpc_tools.protoc -I. --python_out=. --grpc_python_out=. helloworld.proto ``` 编写服务实现代码: ```python import grpc import helloworld_pb2 import helloworld_pb2_grpc class Greeter(helloworld_pb2_grpc.GreeterServicer): def SayHello(self, request, context): return helloworld_pb2.HelloReply(message='Hello, %s!' % request.name) server = grpc.server(futures.ThreadPoolExecutor(max_workers=10)) helloworld_pb2_grpc.add_GreeterServicer_to_server(Greeter(), server) server.add_insecure_port('[::]:50051') server.start() server.wait_for_termination() ``` 最后,编写Etcd服务注册和发现代码: ```python import etcd3 class EtcdRegistry(object): def __init__(self, etcd_host, etcd_port, service_name, service_addr): self.etcd = etcd3.client(host=etcd_host, port=etcd_port) self.service_name = service_name self.service_addr = service_addr self.lease_id = None def register(self, ttl=10): self.lease_id = self.etcd.lease(ttl) self.etcd.put('/{}/{}/{}'.format(self.service_name, self.service_addr, self.lease_id), str(self.service_addr), lease=self.lease_id) self.etcd.refresh_lease(self.lease_id) def unregister(self): if self.lease_id: self.etcd.revoke_lease(self.lease_id) ``` 在服务启动时,调用register()方法注册服务,停止时调用unregister()方法注销服务。 最后,通过Etcd的watch方法,实现服务发现: ```python import etcd3 class EtcdDiscovery(object): def __init__(self, etcd_host, etcd_port, service_name): self.etcd = etcd3.client(host=etcd_host, port=etcd_port) self.service_name = service_name def watch(self): for event in self.etcd.watch_prefix('/{}'.format(self.service_name)): if event.event_type == 'PUT': yield event.key.decode(), event.value.decode() ``` 在客户端中,调用watch()方法监听服务节点的变化,获取可用的服务列表。 以上就是将Etcd和gRPC应用于Python微服务的基本步骤。通过Etcd提供的服务注册和发现功能,可以实现高效的微服务治理,提高微服务的可用性和稳定性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值