父工程依赖pom.xml如下:
代码清单:Alibaba/dubbo-spring-cloud-demo/pom.xml
org.springframework.cloud
spring-cloud-dependencies
${spring-cloud.version}
pom
import
com.alibaba.cloud
spring-cloud-alibaba-dependencies
${spring-cloud-alibaba.version}
pom
import
org.springframework.boot
spring-boot-starter-actuator
org.springframework.boot
spring-boot-starter-web
com.alibaba.cloud
spring-cloud-starter-dubbo
com.alibaba.cloud
spring-cloud-starter-alibaba-nacos-discovery
org.projectlombok
lombok
true
org.springframework.boot
spring-boot-starter-test
test
注意:
-
必须包含**
spring-boot-starter-actuator
**包,不然启动会报错。 -
**
spring-cloud-starter-dubbo
**包需要注意groupId,根据具体使用的spring cloud alibaba版本依赖来确定。 -
如果使用孵化版本,使用的groupId为:
org.springframework.cloud
-
如果使用毕业版本,使用的groupId为:
com.alibaba.cloud
-
以上引用未指定版本,需显示的声明**
<dependencyManagement>
**
API模块,存放Dubbo服务接口和模型定义,非必要,这里创建仅为更好的代码重用以及接口、模型规格控制管理。
定义抽象接口HelloService.java:
代码清单:Alibaba/dubbo-spring-cloud-demo/dubbo_api/src/main/java/com/springcloud/dubbo_api/service/HelloService.java
public interface HelloService {
String hello(String name);
}
创建子工程 dubbo_provider ,Dubbo服务提供方
工程依赖pom.xml如下:
代码清单:Alibaba/dubbo-spring-cloud-demo/dubbo_provider/pom.xml
com.springcloud.book
ch13_1_dubbo_api
${project.version}
此处引入公共API模块。
实现Dubbo接口,HelloServiceI.java如下:
代码清单:Alibaba/dubbo-spring-cloud-demo/dubbo_provider/src/main/java/com/spring
必看视频!获取2024年最新Java开发全套学习资料 备注Java
cloud/dubbo_provider/service/HelloServiceI.java
@Service
public class HelloServiceI implements HelloService {
@Override
public String hello(String name) {
return "Hello " + name;
}
}
注意:这里的**@Service
注解并不是来自Spring的org.springframework.stereotype.Service
,而是Dubbo的org.apache.dubbo.config.annotation.Service
,千万不要引用错误。这里的@Service
**注解仅声明该Java服务(本地)实现为Dubbo服务。
配置文件 application.yml 需要将Java服务(本地)配置为 Dubbo 服务(远程)如下:
代码清单:Alibaba/dubbo-spring-cloud-demo/dubbo_provider/src/main/resources/application.yml
server:
port: 8000
dubbo:
scan:
base-packages: com.springcloud.book.ch13_1_dubbo_provider.service
protocol:
name: dubbo
port: -1
registry:
address: spring-cloud://192.168.44.129
spring:
application:
name: dubbo-spring-cloud-provider
cloud:
nacos:
discovery:
server-addr: 192.168.44.129:8848
main:
allow-bean-definition-overriding: true
注意:在暴露Dubbo服务方面,推荐使用外部化配置的方式,即指定Java服务实现类的扫描基准包。
Dubbo Spring Cloud 继承了 Dubbo Spring Boot 的外部化配置特性,也可以通过标注 @DubboComponentScan 来实现基准包扫描。
-
dubbo.scan.base-packages
:指定 Dubbo 服务实现类的扫描基准包 -
dubbo.protocol
:Dubbo服务暴露的协议配置,其中子属性name为协议名称,port为协议端口(-1 表示自增端口,从 20880 开始) -
dubbo.registry
:Dubbo 服务注册中心配置,其中子属性address 的值 “spring-cloud://192.168.44.129”,说明挂载到 Spring Cloud 注册中心 -
spring.application.name
:Spring 应用名称,用于 Spring Cloud 服务注册和发现。该值在 Dubbo Spring Cloud 加持下被视作**dubbo.application.name
,因此,无需再显示地配置dubbo.application.name
**。 -
spring.main.allow-bean-definition-overriding
:在 Spring Boot 2.1 以及更高的版本增加该设定,因为 Spring Boot 默认调整了 Bean 定义覆盖行为。 -
spring.cloud.nacos.discovery
:Nacos 服务发现与注册配置,其中子属性 server-addr 指定 Nacos 服务器主机和端口。
创建应用主类Ch131DubboProviderApplication.java:
代码清单:Alibaba/dubbo-spring-cloud-demo/dubbo_provider/src/main/java/com/springcloud/dubbo_provider/DubboProviderApplication.java
@SpringBootApplication
@EnableDiscoveryClient
public class DubboProviderApplication {
public static void main(String[] args) {
SpringApplication.run(DubboProviderApplication.class, args);
}
}
工程依赖pom.xml如下:
代码清单:Alibaba/dubbo-spring-cloud-demo/dubbo_consumer/pom.xml
com.springcloud.book
ch13_1_dubbo_api
${project.version}
工程配置application.yml如下:
代码清单:Alibaba/dubbo-spring-cloud-demo/dubbo_consumer/src/main/resources/application.yml
server:
port: 8080
dubbo:
protocol:
name: dubbo
port: -1
registry:
address: spring-cloud://192.168.44.129
cloud:
subscribed-services: dubbo-spring-cloud-provider
spring:
application:
name: dubbo-spring-cloud-consumer
cloud:
nacos:
discovery:
server-addr: 192.168.44.129:8848
main:
allow-bean-definition-overriding: true
dubbo.cloud.subscribed-services
:表示要订阅服务的服务名,可以配置'*'
,代表订阅所有服务,不推荐使用。若需订阅多应用,使用 “,” 分割。
测试接口HelloController.java如下:
代码清单:Alibaba/dubbo-spring-cloud-demo/dubbo_consumer/src/main/java/com/springcloud/dubbo_consumer/controller/HelloController.java
@RestController
public class HelloController {
@Reference
private HelloService helloService;
@GetMapping(“/hello”)
public String hello() {
return helloService.hello(“Dubbo!”);
}
}
注意:这里的**@Reference
注解是org.apache.dubbo.config.annotation.Reference
**。
最后
er/controller/HelloController.java
@RestController
public class HelloController {
@Reference
private HelloService helloService;
@GetMapping(“/hello”)
public String hello() {
return helloService.hello(“Dubbo!”);
}
}
注意:这里的**@Reference
注解是org.apache.dubbo.config.annotation.Reference
**。
最后
[外链图片转存中…(img-UKfqkMQr-1716439075721)]
[外链图片转存中…(img-h59NEx2P-1716439075721)]
[外链图片转存中…(img-mlhLS8q8-1716439075722)]