Dubbo核心概念
- Registry : 注册中心,dubbo支持zookeeper,nacos
- consumer:服务消费方
- provider:服务提供方
Dubbo通过分组和版本去唯一定位一个服务。
- group:分组,区分不同业务
- version:区分不同版本
Springboot整合Dubbo
Maven依赖
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>3.1.0</version>
</dependency>
<dependency>
<groupId>com.alibaba.nacos</groupId>
<artifactId>nacos-client</artifactId>
<version>2.5.0</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
yml配置 : 消费者方,服务方配置相同,消费方也可以提供服务
server:
port: 9876
dubbo:
registry:
address: nacos://192.168.169.223:8848
parameters:
username: nacos
password: nacos
group: dubbo1 # nacos的分组
register-consumer-url: true # 消费者也注册到nacos上
application:
name: dubbo-consumer-demo
protocol:
name: dubbo # 协议类型
port: 20881 # 协议端口
consumer:
check: false # 关闭所有服务的启动时检查 ,使得即使没有提供方也能启动
ncaos:
discovery:
metadata:
application: dubbo-consumer-demo
配置文件导入导出服务
服务提供方
服务接口
package com.yang;
public interface UserService {
void sayHello(String name);
}
实现接口
package com.yang;
public interface ProviderService {
String sayHello(String name);
}
导出服务配置文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:dubbo="http://dubbo.apache.org/schema/dubbo"
xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
<!-- 服务实现Bean -->
<bean id="userService" class="com.yang.UserServiceImpl" />
<!-- 服务暴露 : ref引用bean, group:分组,还可以配置version -->
<dubbo:service interface="com.yang.UserService" ref="userService" group="provider"/>
</beans>
启动类:指名配置文件
@SpringBootApplication
@ImportResource(locations = {"classpath:dubbo-provider.xml","classpath:dubbo-consumer.xml"})
public class provider01App {
public static void main(String[] args) {
// 避免启动缓存冲突
ApplicationHome home = new ApplicationHome(provider01App.class);
File jarFile = home.getSource();
String dirPath = jarFile.getParentFile().toString();
String filePath = dirPath + File.separator + ".dubbo";
System.out.println(filePath);
System.setProperty("dubbo.meta.cache.filePath", filePath);
System.setProperty("dubbo.mapping.cache.filePath",filePath);
SpringApplication.run(provider01App.class, args);
}
}
服务消费方
引用服务配置文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:dubbo="http://dubbo.apache.org/schema/dubbo"
xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
<!-- 服务暴露 -->
<dubbo:reference interface="com.yang.ProviderService" id="providerService" group="provider"/>
</beans>
启动类
@SpringBootApplication
@ImportResource(locations = {"classpath:dubbo-provider.xml","classpath:dubbo-consumer.xml"})
@RestController
@RequestMapping("/consumer")
public class Main {
// 需要和服务提供方一样,边写对应的接口类,方法名称一致,通常来说接口会用一个模块维护,然后引用
@Autowired
private ProviderService providerService;
public static void main(String[] args) {
SpringApplication.run(Main.class, args);
}
@GetMapping("/test")
public void run() {
String result = providerService.sayHello("dubbo");
System.out.println(result);
}
}
基于注解开发
消费方装配时使用注解@DubboReference
// @Reference 用dubbo包也可以
@DubboReference
UserService userService;
服务提供方标注接口实现类使用注解@DubboService
// @Service 也可以,使用dubbo提供的即可
@DubboService
public class ProviderServiceImpl implements ProviderService {
....
}
启动类使用注解标注使用注解开发@EnableDubbo
@EnableDubbo
@SpringBootApplication
public class provider01App {
public static void main(String[] args) {
SpringApplication.run(provider01App.class, args);
}