使用Dubbo作为SpringCloudAlibaba架构中RPC组件。
Dubbo官方文档:https://dubbo.apache.org/zh/
DubboGitHub:https://github.com/apache/dubbo
说明:官方文档中的接入nacos的说明已经很老了,试过之后发现各种jar冲突,所以直接看github上最新的说明就好了,很方便。
搭建Dubbo管理控制台
下载DubboAdmin代码
git clone https://github.com/apache/dubbo-admin.git
修改dubbo-admin-server下application.properties指定注册中心地址
# centers in dubbo2.7
#admin.registry.address=zookeeper://127.0.0.1:2181
#admin.config-center=zookeeper://127.0.0.1:2181
#admin.metadata-report.address=zookeeper://127.0.0.1:2181
server.port=8081
admin.registry.address=nacos://127.0.0.1:8848
admin.config-center=nacos://127.0.0.1:8848
admin.metadata-report.address=nacos://127.0.0.1:8848
admin.root.user.name=root
admin.root.user.password=root
启动DubboServer
mvn --projects dubbo-admin-server spring-boot:run
##或者
cd dubbo-admin-distribution/target
java -jar dubbo-admin-0.1.jar
##或者
cd dubbo-admin-distribution/src/bin
sh startup.sh
访问管理后台
项目集成
创建API项目
api项目提供公共的interface和dto;
这里注意dto类要实现Serializable,因为数据传出过程中需要序列化;
package com.qiejk.commonservices.service;
import com.qiejk.commonservices.dto.UserDto;
public interface IUserService {
Long saveUser(UserDto userDto);
UserDto getUser(Long id);
}
package com.qiejk.commonservices.dto;
import java.io.Serializable;
public class UserDto implements Serializable {
private String name;
private Integer age;
private String birthday;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getBirthday() {
return birthday;
}
public void setBirthday(String birthday) {
this.birthday = birthday;
}
}
创建Provider服务提供项目
pom 引入依赖
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>2.7.10</version>
</dependency>
<!-- Keep latest Nacos client version -->
<dependency>
<groupId>com.alibaba.nacos</groupId>
<artifactId>nacos-client</artifactId>
<version>1.2.1</version>
</dependency>
<dependency>
<groupId>com.qiejk</groupId>
<artifactId>common-services</artifactId>
<version>1.0-SNAPSHOT</version>
<scope>compile</scope>
</dependency>
</dependencies>
编写application.yml配置文件
server:
port: 8091
spring:
application:
name: dubbo-provider
dubbo:
application:
name: dubbo-provider
protocol:
name: dubbo
port: -1
registry:
protocol: nacos
address: 127.0.0.1:8848
group: dubbo ##group 一定要写,否则DubboAdmin无法发现服务
编写服务实现类
使用DubboService修饰实现类
package com.qiejk.dubboprovider.user.impl;
import com.qiejk.commonservices.dto.UserDto;
import com.qiejk.commonservices.service.IUserService;
import org.apache.dubbo.config.annotation.DubboService;
@DubboService(version = "0.0.1")
public class UserServiceImpl implements IUserService {
@Override
public Long saveUser(UserDto userDto) {
return 1L;
}
@Override
public UserDto getUser(Long id) {
UserDto dto = new UserDto();
dto.setBirthday("20210630");
dto.setName("小丸子");
dto.setAge(1);
return dto;
}
}
编写项目启动类
使用EnableDubbo修饰类,即可自动被Dubbo发现
package com.qiejk.dubboprovider;
import org.apache.dubbo.config.spring.context.annotation.EnableDubbo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@EnableDubbo
@SpringBootApplication
public class DubboProviderApplication {
public static void main(String[] args) {
SpringApplication.run(DubboProviderApplication.class, args);
}
}
创建Consumer服务提供项目
pom 引入依赖
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>2.7.10</version>
</dependency>
<!-- Keep latest Nacos client version 不要使用太高版本,否则会出现一些兼容问题-->
<dependency>
<groupId>com.alibaba.nacos</groupId>
<artifactId>nacos-client</artifactId>
<version>1.2.1</version>
</dependency>
<dependency>
<groupId>com.qiejk</groupId>
<artifactId>common-services</artifactId>
<version>1.0-SNAPSHOT</version>
<scope>compile</scope>
</dependency>
</dependencies>
编写application.yml配置文件
server:
port: 8091
spring:
application:
name: dubbo-provider
dubbo:
application:
name: dubbo-provider
registry:
protocol: nacos
address: 127.0.0.1:8848
group: dubbo ##group 一定要写,否则DubboAdmin无法发现服务
编写服务请求类
使用DubboReference注入service
package com.qiejk.dubboconsumer.controller;
import com.qiejk.commonservices.dto.UserDto;
import com.qiejk.commonservices.service.IUserService;
import org.apache.dubbo.config.annotation.DubboReference;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class UserController {
@DubboReference(version = "0.0.1")
private IUserService userService;
@RequestMapping(value = "/userinfo")
@ResponseBody
public UserDto getUser(@RequestParam(value = "uid") Long userId){
return userService.getUser(userId);
}
}
编写项目启动类
使用EnableDubbo修饰类,即可自动被Dubbo发现
package com.qiejk.dubboconsumer;
import org.apache.dubbo.config.spring.context.annotation.EnableDubbo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@EnableDubbo
@SpringBootApplication
public class DubboConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(DubboConsumerApplication.class, args);
}
}
查看效果
分别启动provider和consumer
进入nacos后台可以看到
进入dubbo后台可以看到
测试服务
请求项目