【四】Dubbo整合Springboot

来源:互联网 发布:约翰穆勒知乎 编辑:程序博客网 时间:2024/05/14 03:24

1. 预备工作

这篇是基于之前springboot+mybatis+shiro+redis等完成的,也就目录的置顶系列

同时关于Dubbo、Zookeeper和Dubbo-Admin部署可以看点击这里

2. 建立Consumer项目和Provider项目

将原有的项目中的service实现和所依赖的Dao层,Po实体抽出,当作Provider项目。

将原有的项目中的service实现删去,因为之后实现是由Provider项目实现的。

3. Provider项目代码

首先是pom代码

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">  <modelVersion>4.0.0</modelVersion>  <groupId>com.kfit</groupId>  <artifactId>springboot-provider</artifactId>  <version>0.0.1-SNAPSHOT</version>  <packaging>jar</packaging>  <name>springboot-provider</name>  <url>http://maven.apache.org</url>  <properties>    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>    <java.version>1.7</java.version><mybatis-spring-boot>1.2.0</mybatis-spring-boot><mysql-connector>5.1.39</mysql-connector><spring-boot-starter-redis-version>1.3.2.RELEASE</spring-boot-starter-redis-version>  </properties><!-- spring boot 父节点依赖,引入这个之后相关的引入就不需要添加version配置,spring boot会自动选择最合适的版本进行添加。 --><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>1.5.1.RELEASE</version></parent>  <dependencies>        <!-- spring boot web支持:mvc,aop... --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency>        <!--dubbo start-->        <dependency>            <groupId>com.alibaba</groupId>            <artifactId>dubbo</artifactId>            <version>2.5.3</version>            <exclusions>                <exclusion>                    <groupId>org.springframework</groupId>                    <artifactId>spring</artifactId>                </exclusion>            </exclusions>        </dependency>        <dependency>            <groupId>com.101tec</groupId>            <artifactId>zkclient</artifactId>            <version>0.8</version>            <exclusions>                <exclusion>                    <artifactId>activation</artifactId>                    <groupId>javax.activation</groupId>                </exclusion>                <exclusion>                    <artifactId>mail</artifactId>                    <groupId>javax.mail</groupId>                </exclusion>                <exclusion>                    <artifactId>slf4j-log4j12</artifactId>                    <groupId>org.slf4j</groupId>                </exclusion>            </exclusions>        </dependency>        <dependency>            <groupId>org.apache.zookeeper</groupId>            <artifactId>zookeeper</artifactId>            <version>3.4.6</version>            <exclusions>                <exclusion>                    <artifactId>slf4j-log4j12</artifactId>                    <groupId>org.slf4j</groupId>                </exclusion>            </exclusions>        </dependency>        <!-- dubbo end -->        <!-- Spring Boot Redis 依赖 -->        <dependency>            <groupId>org.springframework.boot</groupId>            <artifactId>spring-boot-starter-redis</artifactId>            <version>${spring-boot-starter-redis-version}</version>        </dependency><!-- thmleaf模板依赖. --><dependency>  <groupId>org.springframework.boot</groupId>  <artifactId>spring-boot-starter-thymeleaf</artifactId></dependency><dependency>      <groupId>com.github.theborakompanioni</groupId>      <artifactId>thymeleaf-extras-shiro</artifactId>     <version>1.2.1</version>  </dependency>  <!-- shiro spring. --><dependency><groupId>org.apache.shiro</groupId><artifactId>shiro-spring</artifactId><version>1.2.2</version></dependency><!-- Spring Boot Mybatis 依赖 --><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>${mybatis-spring-boot}</version></dependency><!-- MySQL 连接驱动依赖 --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>${mysql-connector}</version></dependency><!-- shiro ehcache --><dependency><groupId>org.apache.shiro</groupId><artifactId>shiro-ehcache</artifactId><version>1.2.2</version></dependency>  </dependencies></project>

在这里强调一下,有两种整合方式,xml/注解。但是我用注解方式试了很多次都失败,应该是包冲突问题。所以这里我用xml配置方式。

在Resource下创建一个applicationProvider.xml

<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd "><dubbo:application name="dubbo-demo" /><!-- zookeeper注册中心 --><dubbo:registry address="zookeeper://127.0.0.1:2181" /><dubbo:protocol name="dubbo" port="20880" /><!-- 和本地bean一样实现服务 --> <bean id="userInfoService" class="com.kfit.core.service.impl.UserInfoServiceImpl" /><!-- 向注册中心注册暴漏服务地址,注册服务 --><dubbo:service interface="com.kfit.core.service.UserInfoService"ref="userInfoService" executes="10"  /></beans>
创建完之后,在主程序添加ImportResource,如下
package com.kfit;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.context.annotation.ImportResource;@SpringBootApplication@ImportResource(        locations = {"classpath*:applicationProvider.xml"})public class provider {public static void main(String[] args) {SpringApplication.run(provider.class, args);}}

然后启动Provider,看是否注册到zookeeper(记得打开zookeeper,链接里有说明)可以打开Dubbo Admin界面,看服务者和消费者数量,如果成功的话继续配置Consumer。成功的Dubbo Admin界面显示如下


4. Consumer项目代码

pom代码和Provider一样。记得改下Consumer端口,避免和Provider重复

同样在Resource下创建applicationConsumer.xml

<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdhttp://code.alibabatech.com/schema/dubbo    http://code.alibabatech.com/schema/dubbo/dubbo.xsd"><dubbo:application name="consumer-of-dubbo-demo" /><dubbo:registry address="zookeeper://127.0.0.1:2181" /><dubbo:annotation package="com.kfit.*"/><!-- 向注册中心订阅服务 --><dubbo:reference id="userInfoService" interface="com.kfit.core.service.UserInfoService" /></beans> 
同样,在主程序更改如下

import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.context.annotation.ImportResource;@SpringBootApplication@ImportResource(        locations = {"classpath*:applicationConsumer.xml"})public class Consumer {public static void main(String[] args) {SpringApplication.run(Consumer.class, args);}}

获取bean和以前一样。

@Autowiredprivate UserInfoService userInfoService;

注意Consumer的接口是保留的,接口的实现是从Provider拿的。如果不保留接口,就在pom里把Provider的jar打包进来。

启动之后,再观察Consumer是否从Zookeeper订阅,Dubbo-Admin如下,可以看到消费者订阅服务了。



5. 项目效果

首先是登陆界面


登陆进去之后选择用户查询,输入id,输出查询结果


看Provider后台,显示

INFO 3244 --- [:20880-thread-4] c.k.c.service.impl.UserInfoServiceImpl   : 用户插入缓存 >> id: 1, username: admin,password: 123456

再次查询,显示

INFO 3244 --- [:20880-thread-6] c.k.c.service.impl.UserInfoServiceImpl   : 从缓存中获取了用户 >> id: 1, username: admin,password: 123456

说明Consumer和Provider利用Zookeeper通信成功。