一、背景
Spring Cloud Alibaba
还没发布支持nacos2.*
和Dubbo3.*
的版本支持,调试花了不少时间
二、项目目录规划
- boot-dubbo-api
- boot-dubbo-provider
- boot-dubbo-comsumer
三、版本控制
<properties>
<spring-boot.version>2.5.5</spring-boot.version>
<spring-cloud.version>2020.0.4</spring-cloud.version>
<spring-cloud-alibaba.version>2021.1</spring-cloud-alibaba.version>
<dubbo.boot.version>3.0.3</dubbo.boot.version>
<nacos.boot.version>2.0.3</nacos.boot.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring-boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>com.alibaba.nacos</groupId>
<artifactId>nacos-client</artifactId>
<version>${nacos.boot.version}</version>
</dependency>
<dependency>
<groupId>com.alibaba.nacos</groupId>
<artifactId>nacos-console</artifactId>
<version>${nacos.boot.version}</version>
</dependency>
<dependency>
<groupId>com.alibaba.nacos</groupId>
<artifactId>nacos-config</artifactId>
<version>${nacos.boot.version}</version>
</dependency>
<dependency>
<groupId>com.alibaba.nacos</groupId>
<artifactId>nacos-naming</artifactId>
<version>${nacos.boot.version}</version>
</dependency>
<dependency>
<groupId>com.alibaba.nacos</groupId>
<artifactId>nacos-istio</artifactId>
<version>${nacos.boot.version}</version>
</dependency>
<dependency>
<groupId>com.alibaba.nacos</groupId>
<artifactId>nacos-core</artifactId>
<version>${nacos.boot.version}</version>
</dependency>
<dependency>
<groupId>com.alibaba.nacos</groupId>
<artifactId>nacos-api</artifactId>
<version>${nacos.boot.version}</version>
</dependency>
<dependency>
<groupId>com.alibaba.nacos</groupId>
<artifactId>nacos-common</artifactId>
<version>${nacos.boot.version}</version>
</dependency>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>${dubbo.boot.version}</version>
</dependency>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo</artifactId>
<version>${dubbo.boot.version}</version>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>${spring-cloud-alibaba.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
原本使用nacos:1.4.1
,但一直报找不到方法异常在dubbo-dependencies-bom
的pom文件,依赖了nacos-client:2.0.3
,所以如果升级dubbo3
必须先升级nacos-server:2.0.3
,在升级过程建议分两步走,先升级nacos:2.0.3
再升级dubbo3
,nacos2
使用了grpc
通信,还需要开放9848
和9849
端口,具体Nacos升级到2.0.1心得
四、API模块
pom.xml
<dependencies>
<dependency>
<groupId>com.teddy</groupId>
<artifactId>teddy-swagger-starter</artifactId>
</dependency>
<dependency>
<groupId>com.teddy</groupId>
<artifactId>teddy-beans</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.nacos</groupId>
<artifactId>nacos-api</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.nacos</groupId>
<artifactId>nacos-common</artifactId>
</dependency>
</dependencies>
DTO
@Data
@ApiModel("查询用户")
public class FindUserRequest implements Serializable {
private static final long serialVersionUID = 7385459305929436097L;
@ApiModelProperty("账户名")
private String name;
}
@ApiModel("用户信息")
@Getter
@Setter
@Accessors(chain = true)
public class UserDetailResponse implements Serializable {
private static final long serialVersionUID = 8262316224267833278L;
private Long id;
private String name;
private String nick;
private Integer age;
private Integer gender;
private String phone;
private String email;
}
SERVICE
public interface UserService {
ApiResponse<UserDetailResponse> findByName(FindUserRequest request);
}
五、提供者模块
pom.xml
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bootstrap</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo</artifactId>
</dependency>
<dependency>
<groupId>com.teddy</groupId>
<artifactId>boot-dubbo-api</artifactId>
<version>1.0.0</version>
</dependency>
</dependencies>
配置文件
-
bootstrap.yml
server:
port: 8121
spring:
application:
name: @artifactId@
cloud:
nacos:
discovery:
server-addr: ${NACOS_HOST:192.168.0.102}:${NACOS_PORT:8848}
metadata:
version: v100
context-path: ${server.servlet.context-path}
config:
server-addr: ${spring.cloud.nacos.discovery.server-addr}
file-extension: yml
shared-configs:
- application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}
profiles:
active: @profiles.active@
-
application.yml
spring:
profiles:
active:
dev
include:
- teddy
mvc:
throw-exception-if-no-handler-found: true
jackson:
date-format: yyyy-MM-dd HH:mm:ss
time-zone: GMT+8
default-property-inclusion: NON-NULL
deserialization:
accept_empty_string_as_null_object: true
dubbo:
scan:
base-packages: com.teddy.rpc
protocol:
name: dubbo
port: 8122
registry:
address: nacos://192.168.0.102:8848?username=nacos&password=nacos
application:
name: ${spring.application.name}
启动类
@EnableDiscoveryClient
@SpringBootApplication
public class BootDubboProvider {
public static void main(String[] args) {
SpringApplication.run(BootDubboProvider.class, args);
}
}
服务实现层
@Slf4j
@Service
@DubboService
public class UserServiceImpl implements UserService {
@Override
public ApiResponse<UserDetailResponse> findByName(FindUserRequest request) {
log.info("name:{}", request.getName());
UserDetailResponse response = new UserDetailResponse()
.setId(1L)
.setName("zhangsan")
.setNick("张三")
.setAge(18)
.setGender(1)
.setPhone("13000000000")
.setEmail("zhangsan@gmail.com");
return ApiResponseBuilderUtil.success(response);
}
}
六、服务消费者
pom.xml
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bootstrap</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo</artifactId>
</dependency>
<dependency>
<groupId>com.teddy</groupId>
<artifactId>boot-dubbo-api</artifactId>
<version>1.0.0</version>
</dependency>
</dependencies>
配置文件
-
bootstrap.yml
server:
port: 8131
spring:
application:
name: @artifactId@
cloud:
nacos:
discovery:
server-addr: ${NACOS_HOST:192.168.0.102}:${NACOS_PORT:8848}
metadata:
version: v100
context-path: ${server.servlet.context-path}
config:
server-addr: ${spring.cloud.nacos.discovery.server-addr}
file-extension: yml
shared-configs:
- application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}
profiles:
active: @profiles.active@
-
application.yml
spring:
profiles:
active:
dev
include:
- teddy
mvc:
throw-exception-if-no-handler-found: true
jackson:
date-format: yyyy-MM-dd HH:mm:ss
time-zone: GMT+8
default-property-inclusion: NON-NULL
deserialization:
accept_empty_string_as_null_object: true
dubbo:
protocol:
name: dubbo
registry:
address: nacos://192.168.0.102:8848?username=nacos&password=nacos
application:
name: ${spring.application.name}
启动类
@EnableDiscoveryClient
@SpringBootApplication
public class BootDubboConsumer {
public static void main(String[] args) {
SpringApplication.run(BootDubboConsumer.class, args);
}
}
rpc调用类
@Api(value = "用户前端控制器", tags = "用户前端控制器")
@RestController
@RequestMapping("/user")
public class UserController {
@DubboReference
private UserService userService;
@ApiOperation("查找用户")
@PostMapping("/findByName")
public ApiResponse<UserDetailResponse> sayHello(@Validated @RequestBody FindUserRequest request) {
return userService.findByName(request);
}
}
七、使用
八、注意事项
- nacos需要2.0.3,dubbo3使用的是nacos2.0.3的版本,使用1..,会报找不到方法异常,具体看
dubbo-dependencies-bom
的pom文件 - dubbo用的spring-boot-project项目下的,未来alibaba依赖需要更改,本文只做尝鲜
- dubbo-admin目前还不支持dubbo3
- dubbo3的新协议性能并不好,建议保守使用dubbo协议
- dubbo3升级注册信息为应用级注册,但是为了兼容以前版本保留了,接口级的注册信息