前言:
最近两个月在给新APP做服务端和后台管理系统。应领导的要求,要使用dubbo这款RPC框架将服务端做成微服务。因为之前我就学过dubbo了,不过所有配置都是使用xml来配置的,这样的话服务端项目的xml配置文件就很多了。还有因为公司的旧APP的服务端项目没有使用SpringBoot,所以我觉得使用SpringBoot+Dubbo。因为一开始的时间比较赶,我就直接将以前dubbo的xml配置改成JavaBean配置,也能正常运行,但是有两个问题:
1、因为我将服务分成五大块,所以要运行五个服务的项目,而且要让SpringBoot项目一直运行就要加上web依赖了,就是每个服务都要加一个server.port,这样子端口是使用非常多的,而且不好运维。
2、本地启动服务启动得很慢,不知道是不是因为我自己写的代码的原因【在Linux上不慢】。
解决方案:
1、解决第一个问题可以使用CountDownLatch锁:
在服务启动的时候加个锁,第二当服务关闭,也是当Bean被销毁的时候释放锁。启动类要实现CommandLineRunner接口和DisposableBean接口。
CommandLineRunner接口可以重写run()方法,可以加上自己的业务逻辑。
DisposableBean接口可以重写destroy()方法,这个方法可以监听Bean销毁,当销毁的时候把锁释放即可。
直接上代码,不多说:
/**
* @author howinfun
* @version 1.0
* @desc
* @date 2019/1/23
* @company XMJBQ
*/
@SpringBootApplication
public class UserServiceApplication implements CommandLineRunner, DisposableBean {
private static Logger logger = LoggerFactory.getLogger(UserServiceApplication.class);
@Bean
public CountDownLatch closeLatch() {
return new CountDownLatch(1);
}
public static void main(String[] args){
ApplicationContext ctx = new SpringApplicationBuilder().sources(UserServiceApplication.class)
.web(WebApplicationType.NONE)
.run(args);
CountDownLatch closeLatch = ctx.getBean(CountDownLatch.class);
try {
// 服务开启的时候加锁
closeLatch.await();
}catch (Exception e){
logger.error("服务启动异常",e);
}
}
@Override
public void run(String... args) throws Exception {
logger.info("服务启动中。。。。。");
}
@Override
public void destroy() throws Exception {
logger.info("服务关闭。。。。");
// Bean被销毁,即服务关闭时,释放锁
closeLatch().countDown();
}
}
2、第二个问题使用incubator-dubbo-spring-boot-project集成框架:
因为我使用的是SpringBoot,那么肯定很多关于第三方集成的框架,最后我在github上看到incubator-dubbo-spring-boot-project[appche下孵化的,有专业团队长期运维升级],就决定使用这个集成框架了,这就变得想当的便捷了,而且第三方的开源框架肯定要比自己封装得好而且性能也比自己写的好吧。
github地址:https://github.com/apache/incubator-dubbo-spring-boot-project/blob/master/README_CN.md
下面将简单点说下怎么用,因为我个人感觉有些坑在文档里面找不到的。
1、首先是引入依赖:这里会出现的坑是zookeeper和curator的版本问题
<!--dubbo相关依赖-->
<!--注意:ZooKeeper 3.5.x 版本对应Curator 4.X 版本,ZK服务器也是用3.5.X版本-->
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>0.2.1-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<version>2.6.5</version>
</dependency>
<dependency>
<groupId>com.alibaba.spring</groupId>
<artifactId>spring-context-support</artifactId>
<version>1.0.2</version>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<version>4.1.0</version>
</dependency>
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.12</version>
</dependency>
<!-- curator4.x对应的Zookeeper为3.5.x,如果用zookeeper3.4.x要去掉依赖 -->
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
<version>4.1.0</version>
<exclusions>
<exclusion>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
</exclusion>
</exclusions>
</dependency>
2、接下来是application.properties配置文件:服务提供者和服务消费者
服务提供者:
### 应用名 ####
dubbo.application.name=chain-provider-UserService
dubbo.application.id=chain-provider-UserService
### 服务协议 ####
dubbo.protocol.name=dubbo
dubbo.protocol.id=dubbo
### 端口号指定-1 启动服务时可以为我们分配未使用的端口 #####
dubbo.protocol.port=-1
### 扫面的路径,扫描dubbo的@Service或@Reference #####
dubbo.scan.base-packages=cn.xmjbq.service.impl
### zookeeper注册中心的地址 ####
dubbo.registry.address=zookeeper://xx.xxx.xxx.xx:2181
### 服务端超时时长 #####
dubbo.provider.timeout=5000
### 是否校验 ####
dubbo.provider.validation=true
服务消费者:
### 应用名 ####
dubbo.application.name=chain-consumer-web
dubbo.application.id=chain-consumer-web
### 扫面的路径,扫描dubbo的@Service或@Reference #####
dubbo.scan.base-packages=cn.xmjbq
### zookeeper注册中心的地址 ####
dubbo.registry.address=zookeeper://xx.xxx.xxx.xx:2181
### 服务端超时时长 #####
dubbo.consumer.timeout=5000
### 是否校验 ####
dubbo.consumer.validation=true
### 尝试次数 ####
dubbo.consumer.retries=1
### 是否检查依赖 #####
dubbo.consumer.check=false
3、关于注解,服务提供的就用@Service,服务消费的用@Reference,里面还能填写什么大家可以点击去看看:
下面就不再多介绍了,如果有问题可以到github拉项目来看看或者向我提问