spring boot和thrift、zookeeper建立微服务
原文地址:http://www.cnblogs.com/skyblog/p/5535418.html
Spring cloud适应于云端服务,也适用于企业信息化SOA建设。spring boot也是restful微服务开发的利器。但对于内网服务,即服务与服务之间的调用,spring并没有去刻意封装,也许他们认为已经没有必要了,因为已经有了thrift、ice等强大的框架。
如果是用spring boot本身提供的restful服务作为服务与服务之间的调用,效率低很多,thrift的效率大概是restful的100-1000倍左右。本篇既是基于spring boot框架,结合thrift和zookeeper实现的一个简单微服务框架,服务与服务之间使用thrift通信(thrift既是通信方式也是数据压缩方式)。
本demo一共包括三个工程:
cloud-thrift-server:服务提供方
cloud-thrift-interface:接口及传输对象定义
cloud-thrift-client:服务调用方
开源代码地址:http://git.oschina.net/zhou666/spring-cloud-7simple
1)建立thrift接口定义文档
namespace java cloud.simple.service
struct UserDto {
1: i32 id
2: string username
}
service UserService {
UserDto getUser()
}
接口定义完后,使用thrift命令生成对应的java文件,主要生成两个文件,分别是UserService.java和UserDto.java,把这两个文件放入cloud-thrift-interface工程,因为客户端也需要这个接口定义。
2)实现thrift服务注册
在服务的提供端需要实现接口,并且还要把实现类注册到thrift服务器。
- UserService.Processor processor = new UserService.Processor(
- new UserServiceImpl());
- TServer server = new TThreadPoolServer(new TThreadPoolServer.Args(
- tServerTransport()).processor(processor));
UserServiceImpl就是接口实现类,将其注册金Tserver。
注册完服务后,需要启动Tserver,很显然这个需要在线程里启动。
- executor.execute(new Runnable() {
- @Override
- public void run() {
- tServer().serve();
- }
- });
3) 使用zookeeper进行服务名称注册
上面是注册具体的服务执行类,这一步是将服务的实例注册进zookeeper,这样才能实现负载均衡。让客户端可以根据服务实例列表选择服务来执行。当然这里只需要注册服务所在服务器的IP即可,因为客户端只要知道IP,也就知道访问那个IP下的该服务。
- String servicePath = "/"+serviceName ;// 根节点路径
- ZkClient zkClient = new ZkClient(serverList);
- boolean rootExists = zkClient.exists(servicePath);
- if (!rootExists) {
- zkClient.createPersistent(servicePath);
- }
- InetAddress addr = null;
- try {
- addr = InetAddress.getLocalHost();
- } catch (UnknownHostException e) {
- e.printStackTrace();
- }
- String ip = addr.getHostAddress().toString();
- String serviceInstance = System.nanoTime() +"-"+ ip;
- // 注册当前服务
- zkClient.createEphemeral(servicePath + "/" + serviceInstance);
- System.out.println("提供的服务为:" + servicePath + "/" + serviceInstance);
要注意这里使用zkClient.createEphemeral建立临时节点,如果这台服务器宕机,这个临时节点是会被清除的,这样客户端在访问时就不会再选择该服务器上的服务。
4) 客户端更新服务列表
客户端需要能及时的监听服务列表的变化并作出负载均衡,我们用如下方式监听服务列表的变化:
- // 注册事件监听
- zkClient.subscribeChildChanges(servicePath, new IZkChildListener() {
- // @Override
- public void handleChildChange(String parentPath,
- List<String> currentChilds) throws Exception {
- // 实例(path)列表:当某个服务实例宕机,实例列表内会减去该实例
- for (String instanceName : currentChilds) {
- // 没有该服务,建立该服务
- if (!serviceMap.containsKey(instanceName)) {
- serviceMap.put(instanceName,createUserService(instanceName));
- }
- }
- for (Map.Entry<String, UserService.Client> entry : serviceMap.entrySet()) {
- // 该服务已被移除
- if (!currentChilds.contains(entry.getKey())) {
- serviceMap.remove(entry.getKey());
- }
- }
- System.out.println(parentPath + "事件触发");
- }
- });
有了服务列表,客户端在调用服务的时候就可以采用负载均衡的方式了,在这里使用最简单的随机方式:
- public UserService.Client getBalanceUserService(){
- Map<String, UserService.Client> serviceMap =ZooKeeperConfig.serviceMap;
- //以负载均衡的方式获取服务实例
- for (Map.Entry<String, UserService.Client> entry : serviceMap.entrySet()) {
- System.out.println("可供选择服务:"+entry.getKey());
- }
- int rand=new Random().nextInt(serviceMap.size());
- String[] mkeys = serviceMap.keySet().toArray(new String[serviceMap.size()]);
- return serviceMap.get(mkeys[rand]);
- }
本文结束,具体参见代码,另外,之前还不了解thrift和zookeeper的朋友,不要被他们吓到,其实他们是很轻量级的技术,很容易上手,这也许就是他们流行的原因。
spring boot和thrift、zookeeper建立微服务的更多相关文章
- 使用Ratpack和Spring Boot打造高性能的JVM微服务应用
使用Ratpack和Spring Boot打造高性能的JVM微服务应用 这是我为InfoQ翻译的文章,原文地址:Build High Performance JVM Microservices wit ...
- 使用spring boot和thrift、zookeeper建立微服务
Spring cloud适应于云端服务,也适用于企业信息化SOA建设.spring boot也是restful微服务开发的利器.但对于内网服务,即服务与服务之间的调用,spring并没有去刻意封装,也 ...
- 翻译-使用Ratpack和Spring Boot打造高性能的JVM微服务应用
这是我为InfoQ翻译的文章,原文地址:Build High Performance JVM Microservices with Ratpack & Spring Boot,InfoQ上的中 ...
- Spring Boot (九): 微服务应用监控 Spring Boot Actuator 详解
1. 引言 在当前的微服务架构方式下,我们会有很多的服务部署在不同的机器上,相互是通过服务调用的方式进行交互,一个完整的业务流程中间会经过很多个微服务的处理和传递,那么,如何能知道每个服务的健康状况就 ...
- SpringCloud微服务实战——搭建企业级开发框架(四十四):【微服务监控告警实现方式一】使用Actuator + Spring Boot Admin实现简单的微服务监控告警系统
业务系统正常运行的稳定性十分重要,作为SpringBoot的四大核心之一,Actuator让你时刻探知SpringBoot服务运行状态信息,是保障系统正常运行必不可少的组件. spring-b ...
- 基于Spring Cloud和Netflix OSS构建微服务,Part 2
在上一篇文章中,我们已使用Spring Cloud和Netflix OSS中的核心组件,如Eureka.Ribbon和Zuul,部分实现了操作模型(operations model),允许单独部署的微 ...
- Spring Boot同时开启HTTP和HTTPS服务
由于Spring Boot中通过编码开启HTTPS服务比较复杂,所以官方推荐通过编码开启HTTP服务,而通过配置开启HTTPS服务. Spring Boot的application.yml中添加如下配 ...
- Spring Boot 2.X(十三):邮件服务
前言 邮件服务在开发中非常常见,比如用邮件注册账号.邮件作为找回密码的途径.用于订阅内容定期邮件推送等等,下面就简单的介绍下邮件实现方式. 准备 一个用于发送的邮箱,本文是用腾讯的域名邮箱,可以自己搞 ...
- 今天介绍一下自己的开源项目,一款以spring cloud alibaba为核心的微服务架构项目,为给企业与个人提供一个零开发基础的微服务架构。
LaoCat-Spring-Cloud-Scaffold 一款以spring cloud alibab 为核心的微服务框架,主要目标为了提升自己的相关技术,也为了给企业与个人提供一个零开发基础的微服务 ...
随机推荐
- STL模板整理 pair
pair pair是一种模板类型,其中包含两个数据值,两个数据的类型可以不同.如果一个函数有两个返回值的话,如果是相同类型,就可以用数组返回,如果是不同类型,就可以自己写个struct ,但为了方便就 ...
- Dfs【p4306(bzoj 2208)】 [JSOI2010]连通数
Description 度量一个有向图恋情情况的一个指标是连通,指途中可达点对的个数. 下图的连通数是14 现在要你求出连通数 Input 输入数据第一行是图顶点的数量,一个正整数N. 接下来N行,每 ...
- 17、Flask实战第17天:Flask-cookie
cookie的基本概念 在网站中,http请求是无状态的.也就是说即使第一次和服务器连接并且登录成功后,第二次请求服务器依然不能知道当前请求的是哪个用户. cookie的出现就是为了解决这个问题,第一 ...
- [CF396E]On Iteration of One Well-Known Function
题意:给定$n=\prod\limits_{i=1}^mp_i^{a_i}$,求$\varphi\left(\cdots\varphi\left(n\right)\cdots\right)$(有$k$ ...
- (转)MOMO的Unity3D研究院之深入理解Unity脚本的执行顺序(六十二)
http://www.xuanyusong.com/archives/2378 Unity是不支持多线程的,也就是说我们必须要在主线程中操作它,可是Unity可以同时创建很多脚本,并且可以分别绑定在不 ...
- Ubuntu 16.04通过源码安装QUEM虚拟机
下载编译安装: wget http://download.qemu-project.org/qemu-2.9.0.tar.xz tar xvJf qemu-2.9.0.tar.xz cd qemu-2 ...
- 重大新闻:腾讯大杀器来了,QQ浏览器微信版推出
今日,腾讯在推出windows桌面版的微信后,又发布了一个重量级产品:QQ浏览器微信版 我们在PC端用微信又多了一种方式,而且比windows桌面版本更加友好,更加方便. 我相信:对于我们绝大多数办公 ...
- SQL Server on Linux: How? Introduction: SQL Server Blog
SQL Server Blog Official News from Microsoft’s Information Platform https://blogs.technet.microsoft. ...
- 使用apt-mirror建立局域网内的Debian/Ubuntu源镜像
转:http://forum.ubuntu.org.cn/viewtopic.php?t=41791 第一次翻译,翻译得不好还请大家见谅,多多指出错误~!:) 原文可以见如下的贴子:http://fo ...
- "__doPostBack”未定义的解决办法(转载)
"__doPostBack”未定义,在IE下调试错误: 问题是服务器版的.Net40的补丁没有打上,ASP.NET 可能无法辨识出一些浏览器的最新版本,还会经常把它们看做是低级的浏览器,不支 ...