服务提供者(Provider)
导入Provider方的pom文件
<!--nacos注册中心包-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!--spring-cloud-dubbo的包-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-dubbo</artifactId>
</dependency>
编写Provider方的application.yml文件配置
# 端口
server:
port: 24103
# 服务名
spring:
application:
name: user-provider-dubbo
# 覆盖bean定义
main:
allow-bean-definition-overriding: true
# nacos注册服务
cloud:
nacos:
discovery:
server-addr: 192.168.116.1:8848/
# 数据库
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/springcloud?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC
username: root
password: 123456
dubbo:
protocol:
# 协议名字
name: dubbo
# 动态端口(如果20880端口被占用会,动态往上加)
port: -1
# 扫描包使用DubboService和DubboReference注解
scan:
base-packages: com.guigu.cloud
编写Provider方的UserService的实现类
package com.guigu.cloud.service.impl;
import com.guigu.cloud.domain.TbUser;
import com.guigu.cloud.mapper.UserMapper;
import com.guigu.cloud.service.UserService;
import org.apache.dubbo.config.annotation.DubboService;
import org.springframework.beans.factory.annotation.Value;
import javax.annotation.Resource;
@DubboService
public class UserServiceImpl implements UserService {
@Resource
UserMapper userMapper;
@Value("${server.port}")
String port;
@Override
public TbUser getUserId(Integer id) {
TbUser tbUser = userMapper.selectById(id);
tbUser.setNote("来自:"+port+"服务器");
return tbUser;
}
}
编写Provider方的controller层
@Slf4j //lombok包下的
@RestController
@RequestMapping("user")
public class UserController {
@Resource
UserService userService;
@SneakyThrows //异常注解
@RequestMapping("find/{id}")
public TbUser findById(@PathVariable Integer id){
log.info("provide:id:"+id);
/*测试远程调用的超时时间
Thread.sleep(4000);*/
//从数据库获取id条件的用户
return userService.getUserId(id);
}
}
编写Provider方的启动类
开启dubbo的自动配置
@SpringBootApplication
@MapperScan(basePackages = "com.guigu.cloud.mapper")
@EnableDubbo
public class UserProviderDubboApplication24103 {
public static void main(String[] args) {
SpringApplication.run(UserProviderDubboApplication24103.class,args);
}
}
运行启动类后,可视化界面的结果如下
服务消费者(Consumer)
导入Consumer方的pom文件
<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-dubbo</artifactId>
</dependency>
编写Consumer方的application.yml文件配置
# 端口号
server:
port: 9999
# 服务名
spring:
application:
name: user-consumer-dubbo
# 覆盖bean定义
main:
allow-bean-definition-overriding: true
# nacos注册服务
cloud:
nacos:
discovery:
server-addr: 192.168.116.1:8848/
dubbo:
protocol:
# 协议
name: dubbo
# 动态端口
port: -1
cloud:
# 订阅提供者服务名(*)订阅所有
subscribed-services: user-provider-dubbo
scan:
# 扫描包使用DubboService和DubboReference
base-packages: com.guigu.cloud
编写Consumer方的controller层
@Slf4j
@RestController
@RequestMapping("dubbo")
public class UserController {
//引用impl层的接口
@DubboReference
UserService userService;
@RequestMapping("getUser/{id}")
public TbUser findById(@PathVariable Integer id){
TbUser userId = userService.getUserId(id);
log.info(String.valueOf(userId));
return userId;
}
}
编写Consumer方的启动类
开启dubbo的自动配置
@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)
@EnableDubbo
public class UserConsumerDubboApplication9999 {
public static void main(String[] args) {
SpringApplication.run(UserConsumerDubboApplication9999.class,args);
}
}
运行启动类后,可视化界面的结果如下
注:
服务提供者 和 服务消费者 的dubbo端口不能重复
要先启动服务提供者 后启动 服务消费者
(服务消费者会去获取提供者的服务)