java服务中间件之旅(一):dubbo入门

前言

说起来这应该是博主的第一篇博客,平时博主一直都有记录笔记的习惯,都是以记录核心知识点的形式进行记录。工作几年,越发觉得分享自己的观点对于自身以及团队的成长是多么的关键,于是开始动手写这第一篇博客,也希望自己能够坚持下去。markdown语法用得不对,排版有问题请多包涵,也多提建议。文章本身的观点有不同看法,也尽情拍砖。
接下来的一段时间应该会使用较多的中间件,今天先来一篇最简单的dubbo入门,预告下一次的博客主题为“dubbo项目实践”,如果有时间,可能会自己尝试去实现一个简单的java中间件。废话不多说,开始我们今天的dubbo入门!

后端服务架构演化过程:

Paste_Image.png

针对某项目的架构演化过程:

项目架构演进过程中,给我感受最深的一点:所有项目演化过程其实都是大同小异,但最重要的是,去思考在什么阶段采用什么架构是最合适的,并在项目中去运用、解决实际的问题

  • 最初的单war包单服务器项目

    最简单的项目,所有的业务都在一个项目中,数据库,tomcat等都在同一台服务器上,采用session进行用户权限验证(并不是指session不好😄),文件保存在tomcat/nginx下

  • 项目业务的拆分
    随着业务发展,原有的架构出现了瓶颈,生产环境对app的项目要求稳定,但运营端的版本迭代速度明显要快于app,再在同一个java项目里对新版本部署带来很多麻烦,于是业务相关不大的项目就进行了拆分:运营端/app/销售项目/h5活动等等

  • 数据库/缓存/文件系统的拆分

    这个比较简单,就简单说下,无非是将其它的一些共用服务从原有的部署服务器上抽调出去,比如rds,七牛云等

  • 前后端分离

    前后端分离的事贯穿全程,从最初的jsp + form + iframe 到 ajax 横空出世,再到后面各种mvc/mvvm框架(angularjs, avalonjs等), 直到目前的前端nodejs代理层(也许不仅仅是代理层)

  • 通过maven将代码组件化

    整合大量公用代码,并将通用的服务从繁重的业务项目中独立出去。比如xxx(某不愿意透露姓名的互联网项目)项目中的im、通知中心、定时计划等服务

  • 进行读写分离与集群

    尽量减少分布式服务中的单点服务,提高服务的稳定性与性能。并对数据库进行读写分离。

  • 通过服务中间件进行服务优化

    今日的主题,通过dubbo来对架构变得更加立体化,提高稳定性,提升服务质量,提升代码维护的效率。

dubbo服务简介

官方服务文档:

[http://dubbo.io/User+Guide-zh.htm#UserGuide-zh-%E8%83%8C%E6%99%AF][1]

非常详细,阅读前提:spring、redis / zookeeper、maven 等有一定的了解

dubbo服务架构

Paste_Image.png

节点说明:

  • Provider: 暴露服务的服务提供方,即接口的实现者
  • Consumer: 调用远程服务的服务消费方。 即客户端,调用接口方
  • Registry: 服务注册与发现的注册中心。 服务注册中心,大多由zookeeper来实现(我们的demo也主要围绕zookeeper注册中心来讲
    ps:redis的注册中心超难用,文档demo非常少)
  • Monitor: 统计服务的调用次调和调用时间的监控中心。 非必需,dubbo有自带一个dubbo-admin 项目可用
  • Container: 服务运行容器。 包括但不限于jboss / tomcat / jetty
    等,甚至是轻量级的服务,可通过main方法启动。

参考文章:http://www.cnblogs.com/ghj1976/p/5316126.html

dubbo服务优点

  • 像调用内部接口一样调用远程服务(再也不用该死的httpclient和难用的webservice了)
  • 接口调用的负载均衡机制:轮询、随机、权重等
  • 容灾机制:某个server挂了,还有其它的server。就算是注册中心挂了,内部的缓存仍然有效(比如某个接口由xxx.xx.xx.xx这台服务器提供服务,这个信息会缓存着)
  • 通过心跳机制动态的注册/使用服务
  • 与spring高度集成,使用方便
  • 接口版本号控制

开始我们的dubbo之旅

demo代码:

git@git.oschina.net:jianli/dubbo-demo.git

先来看下项目结构:

Paste_Image.png

dubbo-api 在此demo中作为公用的接口项目,包括接口,请求参数,与返回类
dubbo-server 作为服务生产者,提供服务(实现接口)
dubbo-custom 作为服务消费者,使用服务(调用接口)

项目代码我就不全贴了,git 上有,现在讲一下最基本的流程,以helloworld开始

1.安装启动zookeeper

ftp://ftp.kddilabs.jp/infosystems/apache/zookeeper/zookeeper-3.4.8/zookeeper-3.4.8.tar.gz

下载后解压

配置zookeeper的主要配置文件:
zoo.cfg:

tickTime=2000
dataDir=/Users/lijian/Desktop/1.4.0
clientPort=2181

通过bin/zkServer.sh start启动

导入项目

git clone

不多说

3.启动dubbo-server项目。

先看主要配置文件:

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
        xsi:schemaLocation="
        http://code.alibabatech.com/schema/dubbo    http://code.alibabatech.com/schema/dubbo/dubbo.xsd
         http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd
         http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd">
        
        <context:component-scan
            base-package="com.lijian.**" />
  
        <context:annotation-config />
    
    <!-- 公共信息,也可以用dubbo.properties配置 -->
    <dubbo:application name="lalocal-server"/>
    <dubbo:registry address="zookeeper://127.0.0.1:2181"/>
     <dubbo:protocol name="dubbo" port="-1"/>
    <!-- 扫描注解包路径,多个包用逗号分隔,不填pacakge表示扫描当前ApplicationContext中所有的类 -->
    <dubbo:annotation package="com.lijian.dubbo.service" />
    </beans>

主要指定了应用名,注册中心地址,dubbo协议端口号(-1为自动分配,之后细讲),和注解扫描路径

编写接口的实现类

    package com.lijian.dubbo.service.impl;
    import com.alibaba.dubbo.config.annotation.Service;
    import com.lijian.dubbo.service.HelloService;
    @Service
    public class HelloServiceImplv1 implements HelloService{
    
        public String hello(String name) {
            return "Hello, "+name;
        }
    
    }

十分简单,注意Service是dubbo的注解,不是spring的Service

然后启动spring容器,最简单的,通过main方法启动:

public class MainZookeeperClass {
    @SuppressWarnings("resource")
    public static void main(String[] args){
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        context.start();
        System.out.println("服务已经启动...");
        try {
            System.in.read();
        } catch (IOException e) {
            e.printStackTrace();
        } // 按任意键退出
    }
}

4. 启动dubbo-custom项目

主要配置文件:

 <dubbo:application name="test-client"/>
    <dubbo:registry address="zookeeper://127.0.0.1:2181" />
    <dubbo:annotation package="com.lijian.dubbo.customer" />
    </beans>

比较简单,不多说

接口的引用UserAction:

package com.lijian.dubbo.customer.action;

import org.springframework.stereotype.Component;

import com.alibaba.dubbo.config.annotation.Reference;
import com.lijian.dubbo.service.HelloService;

@Component
public class UserAction {

    @Reference
    HelloService helloService;
    
    public String say(String a){
        return helloService.hello(a + a);
    }
}

主要是@Reference的注解

启动Main方法:

public class MainClass {
    public static void main(String[] args){
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        context.start();
        
        UserAction userAction = context.getBean(UserAction.class);
        String a = userAction.say("user ");
        System.out.println(a);
        
        try {
            System.in.read();
        } catch (IOException e) {
            e.printStackTrace();
        } // 按任意键退出
    }
}

控制台输出:

Paste_Image.png

5. 搭建dubbo服务的监控中心

从git 上下载dubbo-admin项目
https://github.com/alibaba/dubbo.git

dubbo-admin是一个web项目,需要使用web容器,jboss,tomcat都可以,方便起见,我们使用jetty

dubbo-admin 默认连接本地的2181端口,默认有root和guest两个帐号。这里我们采用默认的配置, 如果要改的话,改动/dubbo-admin/src/main/webapp/WEB-INF/dubbo.properties文件

启动dubbo-admin:

mvn jetty:run

然后登陆127.0.0.1:8080 去查看

至此,一个最简单的dubbo服务已经完成。回顾一下dubbo的服务架构,注册中心,生产者,消费者,容器,监控中心都有了😊。

下一篇博客,将为大家带来dubbo的实战讲解,讲我在dubbo中遇到的一些坑,以及常用的业务场景

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容