快速搭建Dubbo服务

Dubbo服务的发展和作用:

  首先,看下一般网站架构随着业务的发展,逻辑越来越复杂,数据量越来越大,交互越来越多之后的常规方案演进历程。

image.png

   其次,当服务越来越多之后,我们需要做哪些服务治理?

image.png

 最后,是dubbo的架构图

image.png

 dubbo支持多种类型的注册中心:

        •  Multicast注册中心

        •  Zookeeper注册中心

        •  Redis注册中心

        •  Simple注册中心

dubbo的简单环境搭建

  1、安装zookeeper

    我的是Windows安装,直接解压安装就OK了,注意,zookeeper目录下的conf文件夹中并没有zookeeper的配置文件,不过有一个zoo_sample.cfg文件,将其命令为zoo.cfg即可使用默认配置。

   关于Zookeeper的学习可以看我之前的Zookeeper系列;

image.png

  点击zkServer.cmd启动zookeeper:

 2、安装dubbo-admin.war

   安装dubbo-admin.war这一步是非必需的,不过使用dubbo-admin可以方便查看dubbo的运行状态和数据,便于管理。下载完成后放入到tomcat的webapps目录下,启动tomcat访问dubbo即可,登录之后就可以看到如下页面(登录用户名和密码在dubbo.properties文件中查看):

image.png

 3、dubbo-server端配置

   新建dubbo-server工程,下载所需的jar包,编写提供服务的接口和实现类,然后通过zookeeper注册中心暴露服务。

   (3.1) 在maven文件中添加所需jar包的依赖:

    

<dependencies>

<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>


<!-- spring核心包 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>

<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-oxm</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>${spring.version}</version>
</dependency>

<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${spring.version}</version>
</dependency>

<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>${spring.version}</version>
</dependency>

<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>${spring.version}</version>
</dependency>

<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${spring.version}</version>
</dependency>


<!-- 日志文件管理包 -->
<!-- log start -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>${log4j.version}</version>
</dependency>


<!-- 格式化对象,方便输出日志 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.1.41</version>
</dependency>


<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>${slf4j.version}</version>
</dependency>

<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>${slf4j.version}</version>
</dependency>


<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<version>2.5.3</version>
<exclusions>
<exclusion>
<artifactId>spring</artifactId>
<groupId>org.springframework</groupId>
</exclusion>
</exclusions>
</dependency>

<!-- Zookeeper 用于分布式服务管理 -->
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.6</version>
</dependency>

<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>0.9</version>
</dependency>


<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
<version>1.0.0.GA</version>
</dependency>

<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>4.2.0.Final</version>
</dependency>


<dependency>
   <groupId>org.mybatis</groupId>
   <artifactId>mybatis</artifactId>
   <version>3.4.1</version>
</dependency>

<dependency>
   <groupId>org.mybatis</groupId>
   <artifactId>mybatis-spring</artifactId>
   <version>1.3.0</version>
</dependency>

<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.0.27</version>
</dependency>

<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>1.8.2</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.8.2</version>
</dependency>

<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.34</version>
</dependency>
</dependencies>

 以上的配置未必需要这么多,但是我本身做了额外的一些功能,所以需要;

  (3.2) 工程spring文件 dubbo 生产者 配置如下:

    demo-provider.xml:

<!-- 具体的实现bean -->
	<bean id="demoService" class="com.viemall.dubbo.demo.DemoServiceImpl" />

     <!-- 提供方应用信息,用于计算依赖关系 -->
	<dubbo:application name="demoService-provider" />

	<!-- 使用zookeeper注册中心暴露服务地址 -->
	 <dubbo:registry protocol="zookeeper" address="zookeeper://127.0.0.1:2181" /> 
	 <!-- <dubbo:registry address="multicast://224.5.6.7:1234" /> -->

	<!-- 用dubbo协议在20880端口暴露服务 -->
	<dubbo:protocol name="dubbo" port="20880"  />

	<!-- 声明需要暴露的服务接口  写操作可以设置retries=0 避免重复调用SOA服务 -->
	<dubbo:service  interface="com.viemall.dubbo.demo.DemoService" ref="demoService" />

  (3.3) 对外服务接口及其实现类:

public interface DemoService {
   public String sayHello(String name);  
}
public class DemoServiceImpl implements DemoService {

 public String sayHello(String name) {
   System.out.println("DemoServiceImpl sayHello");
       return "Hello " + name;    
   }    
}

  (3.4)Provider启动类:

public static void main(String[] args) throws Exception {
    ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(
    new String[] { "demo/demo-provider.xml" });
        context.start(); 
        System.in.read(); // 为保证服务一直开着,利用输入流的阻塞来模拟
}

  (4.1) 工程spring文件 dubbo 服务消费者 配置如下:

  demo-consumer.xml: 为了方便就没有新建多一个消费者的Client项目了,原理一样;

<!-- 消费方应用名,用于计算依赖关系,不是匹配条件,不要与提供方一样 -->
<dubbo:application name="demoService-consumer" />

<dubbo:registry address="zookeeper://127.0.0.1:2181" /> 
<!-- <dubbo:registry address="multicast://224.5.6.7:1234" /> -->

<!-- 生成远程服务代理,可以像使用本地bean一样使用demoService 检查级联依赖关系
   默认为true 当有依赖服务的时候,需要根据需求进行设置 -->
<dubbo:reference  loadbalance="roundrobin"   id="demoService" check="false" 
  interface="com.viemall.dubbo.demo.DemoService" />

 (4.2) Consumer 服务调用类:

public static void main(String[] args) throws Exception {
    ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(
    new String[] { "demo/demo-consumer.xml" });
    context.start();

    DemoService sampleService = (DemoService) context.getBean("demoService");
    String hello = sampleService.sayHello("TOny-----");
}

 项目的目录结构:

 image.png

    启动Provider服务:

 image.png

   启动Consumer消费者:

 image.png

    参考:

    1、  http://dubbo.io/User+Guide-zh.htm#UserGuide-zh-%E6%9C%8D%E5%8A%A1%E6%8F%90%E4%BE%9B%E8%80%85

发表评论