前言
进行服务改造,使用dubbo作为soa解决方案。现有的服务使用dubbo,而以前的服务有直接用http或者spring cloud调用的,要保证改造完成的服务与未改造的服务都可以正常的调用。同样不想留下太多的技术债务,去掉无效依赖。
解决方案
提供dubbo自定义传输协议dubbo,同时提供dubbo的restapi协议。
步骤
pom
服务提供者
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo-rpc-rest</artifactId>
<version>2.6.5</version>
</dependency>
<dependency>
<groupId>com.alibaba.spring.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
</dependency>
api子模块
作用域设为provided,因为dubbo-rpc-rest依赖里面已经内置了javax.ws.rs-api 作用域设为provided,因为dubbo-rpc-rest依赖里面已经内置了javax.ws.rs-api 作用域设为provided,因为dubbo-rpc-rest依赖里面已经内置了javax.ws.rs-api
<dependency>
<groupId>javax.ws.rs</groupId>
<artifactId>javax.ws.rs-api</artifactId>
<version>2.1.1</version>
<scope>provided</scope>
</dependency>
springboot启动配置
spring:
application:
name: xxxxxxxx
dubbo:
server: true
registry: zookeeper://127.0.0.1:2181
consumer:
timeout: 60000
protocols:
- name: dubbo
- name: rest
port: 8888
server: tomcat
contextpath: server
server类操作
一定要注意@Consumes与@Produces
- consumes是数据接收方式
- produces是数据返回方式
@Path("user")
@Consumes({MediaType.APPLICATION_JSON, MediaType.TEXT_XML})
public interface UserService {
@GET
@Path("get")
void get();
}
注意:Service一定要加上protocol= {"dubbo","rest"},当提供多协议的时候,dubbo不会默认提供
所有的提供。
@Service(interfaceClass = UserService.class , protocol= {"dubbo","rest"})
@Transactional(rollbackFor = Exception.class)
public class UserServiceImpl implements UserService {
public void get(){
}
}
运行,直接在浏览器里面http://127.0.0.1:8888/server/users/get 可以看到方法被调用。
结语
这个技术方案解决了旧系统架构和旧微服务架构向新微服务架构过度的兼容。很大程度上保证了系统的稳定性,