SpringBoot(四):与dobbo的整合(注解形式与xml形式)

来源:互联网 发布:淘宝图片推荐几款相机 编辑:程序博客网 时间:2024/06/06 05:16

平时项目一直用的ssm+dubbo,现在公司打算采用springboot+dubbo整合,所以就去研究了下。

这里写出两种形式的整合,凭兴趣爱好选择。


一.初始化mysql表:

  1. DROP TABLE `user` IF EXISTS  
  2. CREATE TABLE `user` (  
  3.   `id` varchar(32) NOT NULL,  
  4.   `name` varchar(255) DEFAULT NULL,  
  5.   `age` int(11) DEFAULT NULL,  
  6.   PRIMARY KEY (`id`)  
  7. ) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

二、构建项目

为了测试方便起见,这里使用JPA+H2数据库

项目结构

1、user-api


如果使用JPA,实体上加注解,需要引入

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jpa</artifactId></dependency>
实体类

@Entity@Table(name = "t_user")public class User implements Serializable{private static final long serialVersionUID = -1369148652554782331L;@Id    @GeneratedValueprivate Integer id;private String name;private Integer age;get/set省略。。。
service类略...


2、user-service(基于注解的实现)



需要添加的依赖

<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jpa</artifactId></dependency><!-- h2数据库 --><dependency><groupId>com.h2database</groupId><artifactId>h2</artifactId><scope>runtime</scope></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>com.example</groupId><artifactId>user-api</artifactId><version>0.0.1-SNAPSHOT</version></dependency><!-- Spring Boot Dubbo 依赖 --><dependency><groupId>io.dubbo.springboot</groupId><artifactId>spring-boot-starter-dubbo</artifactId><version>1.0.0</version></dependency></dependencies>
配置文件application.properties

spring.jpa.hibernate.ddl-auto=createspring.jpa.hibernate.show-sql: truespring.h2.console.enabled: true      server.port=8081# Dubbo 生产者spring.dubbo.application.name=provider# 注册中心spring.dubbo.registry.address=zookeeper://localhost:2181# 协议spring.dubbo.protocol.name=dubbo# 端口spring.dubbo.protocol.port=20880# 扫描包spring.dubbo.scan=com.example.demo

userDao

/** * userDao * @author majie */@Repositorypublic interface UserDao extends JpaRepository<User, String> {}
userServiceImpl

import java.util.List;import org.springframework.beans.factory.annotation.Autowired;import com.example.demo.dao.UserDao;import com.example.demo.entity.User;import com.example.demo.service.UserService;import com.alibaba.dubbo.config.annotation.Service;//这里引入的不是spring的service包/** * service实现类 * 约定生产者在实现类上提供dubbo服务 *  * @author majie */@Service(version="1.0.0")public class UserServiceImpl implements UserService {@Autowiredprivate UserDao dao;  //其他方法省略
version表示版本号

其他配置,基本和xml中配置一样,只不过这里是写入类里面了



启动类

package com.example.demo;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplicationpublic class Provider {    public static void main(String[] args) throws InterruptedException {    SpringApplication.run(Provider.class, args);    }}
使用注解的启动类不需要改变


user-service(基于xml实现)
修改dubbo依赖为(现在dubbo更新到了2.5.4还没去试过)

<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>org.apache.zookeeper</groupId><artifactId>zookeeper</artifactId><version>3.4.6</version><scope>compile</scope></dependency><dependency><groupId>com.101tec</groupId><artifactId>zkclient</artifactId><version>0.4</version></dependency>


配置文件

spring-dubbo.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-provider" /><!-- 使用zookeeper注册中心暴露服务地址 --><dubbo:registry protocol="zookeeper" address="localhost:2181" /><!-- 用dubbo协议在20880端口暴露服务 --><dubbo:protocol name="dubbo" port="20880" /><!-- 声明需要暴露的服务接口 --><dubbo:service interface="com.example.demo.service.UserService" ref="userService" /></beans>


启动类

import java.util.concurrent.CountDownLatch;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.boot.builder.SpringApplicationBuilder;import org.springframework.context.ApplicationContext;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.ImportResource;@SpringBootApplication@ImportResource({"classpath:spring-dubbo.xml"})   //引入配置文件public class Provider {    private static final Logger logger = LoggerFactory.getLogger(Provider.class);    @Bean    public CountDownLatch closeLatch() {        return new CountDownLatch(1);    }    public static void main(String[] args) throws InterruptedException {        ApplicationContext ctx = new SpringApplicationBuilder().sources(Provider.class).web(false).run(args);        logger.info("项目启动!");        CountDownLatch closeLatch = ctx.getBean(CountDownLatch.class);        closeLatch.await();    }}


@Service的注解要改成spring的注解


3、web消费者(基于注解)


添加依赖

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>com.example</groupId><artifactId>user-api</artifactId><version>0.0.1-SNAPSHOT</version><!-- 排除这个jar 不引入数据库 --><exclusions><exclusion><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jpa</artifactId></exclusion></exclusions></dependency><!-- Spring Boot Dubbo 依赖 --><dependency><groupId>io.dubbo.springboot</groupId><artifactId>spring-boot-starter-dubbo</artifactId><version>1.0.0</version></dependency>
因为引入了user-pai,所以会引入jpa的jar,springboot是会根据依赖自动去扫描,看是有该配置,如果没有就会报错,

这里为了不在web中引入数据库,需要排除该jar.再或者你在配置文件配置和service一样的


配置文件

server.port=8080## Dubbo 服务消费者配置spring.dubbo.application.name=consumerspring.dubbo.registry.address=zookeeper://localhost:2181spring.dubbo.scan=com.example.demo


Controller

@RestControllerpublic class UserController {@Reference(version="1.0.0")private UserService userService;@GetMapping("/get")public List<User> getUser() {return userService.getList();}
这里需要使用@Reference注解,而不是使用@Autowired或者@Resource,当然后面对应的信息也需要和生产者类似

启动入口和servic一样。


web消费者(基于xml)

依赖修改和service一样

配置文件:spring-duubo.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-consumer" /><!-- 使用zookeeper注册中心暴露服务地址 --><dubbo:registry protocol="zookeeper" address="localhost:2181" /><!-- 声明需要暴露的服务接口 --><dubbo:reference id="userService" interface="com.example.demo.service.UserService" /></beans>

Controller层和正常的springmvc一样写法

注入用@Autowired或者@Resource

启动类一样,引入文件就好。


测试

启动zk以后,因为我们没有设置check=false,所以这里先启动生产者,然后在启动消费者进行测试


最后关于热部署的问题。

springboot整合dubbo的时候,如果引入

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId></dependency>
会报错。可能是jar包冲突引起的,弄了半天没有解决。就换了种方式

引入依赖

<dependency><groupId>org.springframework</groupId><artifactId>springloaded</artifactId></dependency>
添加build

<build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><dependencies><!-- spring热部署 --><dependency><groupId>org.springframework</groupId><artifactId>springloaded</artifactId><version>1.2.7.RELEASE</version></dependency></dependencies></plugin></plugins></build>
启动的时候需要debug启动,才能完成热部署。

有不对或者不周全的地方望大家指正

原创粉丝点击