文章目录
- 构建服务接口
- 构建服务接口提供方
- 构建服务接口消费方
Spring Cloud是一套较为完整的架构方案,而Dubbo只是服务治理与RPC实现方案。
Dubbo的注册中心采用了ZooKeeper,而Spring Cloud体系中的注册中心并不支持ZooKeeper。直到Spring Cloud Alibaba的出现,才得以解决这样的问题,Spring Cloud Alibaba中的Nacos来作为服务注册中心,并且在此之下可以如传统的Spring Cloud应用一样地使用Ribbon或Feign来实现服务消费,并提供了Spring Cloud Alibaba下额外支持的RPC方案:Dubbo
构建服务接口
1
2
3
4public interface HelloService { String hello(String name); }
构建服务接口提供方
(1)创建一个Spring Boot项目,在pom.xml中引入第一步中构建的API包以及Spring Cloud Alibaba对Nacos和Dubbo的依赖
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34<dependency> <groupId>top.onething</groupId> <artifactId>product-api</artifactId> <version>1.0-SNAPSHOT</version> </dependency> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> <version>2.2.1.RELEASE</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <version>2.2.5.RELEASE</version> </dependency> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> <version>2.2.1.RELEASE</version> </dependency> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-dubbo</artifactId> <version>2.2.1.RELEASE</version> </dependency> <!--Dubbo Spring Cloud基于Spring Cloud Commons开发的,org.apache.http.client.HttpClient类确实存在于旧版本的httpclient中, 但是它使用内部的org.apache.http.impl.client.HttpClientBuilder类在新版本中却不存在--> <dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpclient</artifactId> <version>4.5.4</version> <scope>compile</scope> </dependency>
spring-cloud-starter-dubbo基于spring-cloud-starter-commons开发的,org.apache.http.client.HttpClient类确实存在于旧版本的httpclient中,但是它使用内部的org.apache.http.impl.client.HttpClientBuilder类在新版本中却不存在。如果类路径上没有HttpClient,则HttpClientConfiguration自动配置将失败 HttpClientConfiguration的自动配置因对HttpClient的旧依赖性而失败,异常如下所示:
1
2
3java.lang.IllegalStateException: Error processing condition on org.springframework.cloud.commons.httpclient.HttpClientConfiguration$ApacheHttpClientConfiguration.apacheHttpClientBuilder Caused by: java.lang.ClassNotFoundException: org.apache.http.impl.client.HttpClientBuilder
(2)实现Dubbo接口
1
2
3
4
5
6
7
8@Service public class HelloServiceImpl implements HelloService { @Override public String hello(String name) { return "hello " + name; } }
注意:@Service注解不是Spring的,而是dubbo的,完全限定名为:org.apache.dubbo.config.annotation.Service
(3)配置Dubbo服务相关的信息
配置说明如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38spring: application: name: dubbo-consumer cloud: nacos: discovery: server-addr: www.onething.top:8848 # nacos服务注册中心的地址 cluster-name: consumer-cluster #集群名称 namespace: b7ef9579-df75-41c2-8a95-e04aa03c273a #命名空间 config: server-addr: www.onething.top:8848 # nacos配置中心地址 namespace: b7ef9579-df75-41c2-8a95-e04aa03c273a file-extension: yaml #配置文件的后缀名 refresh-enabled: true #默认true:自动刷新 dubbo: protocol: #Dubbo 服务暴露的协议配置,其中子属性 name 为协议名称,port 为协议端口( -1 表示自增端口,从 20880 开始) name: dubbo port: -1 #dubbo协议缺省端口为20880,rmi协议缺省端口为1099,http和hessian协议缺省端口为80;如果没有配置port,则自动采用默认端口,如果配置为-1,则会分配一个没有被占用的端口。Dubbo 2.4.0+,分配的端口在协议缺省端口的基础上增长,确保端口段可控 registry: #dubbo服务注册端口,注册中心服务器地址,如果地址没有端口缺省为9090,同一集群内的多个地址用逗号分隔,如:ip:port,ip:port #其中前缀spring-cloud说明:挂载到 Spring Cloud注册中心 address: spring-cloud://www.onething.top:8848 #check: false #关闭注册中心是否启动的相关检查,false表示不检查注册中心是否启动,就不会报错 cloud: subscribed-services: dubbo-product consumer: check: false #关闭订阅服务是否启动的检查【检查时,没有服务提供者会报错】
dubbo.scan.base-packages: 指定 Dubbo 服务实现类的扫描基准包
dubbo.protocol: Dubbo 服务暴露的协议配置,其中子属性 name 为协议名称,port 为协议端口( -1 表示自增端口,从 20880 开始)
dubbo.registry: Dubbo 服务注册中心配置,其中子属性 address 的值 “spring-cloud://localhost”,说明挂载到 Spring Cloud 注册中心
注意:如果使用Spring Boot 2.1及更高版本时候,需要增加配置spring.main.allow-bean-definition-overriding=true
(4)创建应用主类
1
2
3
4
5
6
7
8@EnableDiscoveryClient【此注解可以省略】 @SpringBootApplication public class DubboServerApplication { public static void main(String[] args) { SpringApplication.run(DubboServerApplication.class, args); } }
构建服务接口消费方
(1)创建一个Spring Boot项目,在pom.xml中引入第一步中构建的API包以及Spring Cloud Alibaba对Nacos和Dubbo的依赖,具体内容与服务提供方一致
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28<dependencies> <dependency> <groupId>top.onething</groupId> <artifactId>product-api</artifactId> <version>1.0-SNAPSHOT</version> </dependency> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> <version>2.2.1.RELEASE</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <version>2.2.5.RELEASE</version> </dependency> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> <version>2.2.1.RELEASE</version> </dependency> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-dubbo</artifactId> <version>2.2.1.RELEASE</version> </dependency> </dependencies>
(2)配置Dubbo服务相关的信息
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32spring: application: name: dubbo-consumer cloud: nacos: discovery: server-addr: www.onething.top:8848 # nacos服务注册中心的地址 cluster-name: consumer-cluster #集群名称 namespace: b7ef9579-df75-41c2-8a95-e04aa03c273a #命名空间 config: server-addr: www.onething.top:8848 # nacos配置中心地址 namespace: b7ef9579-df75-41c2-8a95-e04aa03c273a group: test-group file-extension: yaml #配置文件的后缀名 dubbo: protocol: #Dubbo 服务暴露的协议配置,其中子属性 name 为协议名称,port 为协议端口( -1 表示自增端口,从 20880 开始) name: dubbo port: -1 #dubbo协议缺省端口为20880,rmi协议缺省端口为1099,http和hessian协议缺省端口为80;如果没有配置port,则自动采用默认端口,如果配置为-1,则会分配一个没有被占用的端口。Dubbo 2.4.0+,分配的端口在协议缺省端口的基础上增长,确保端口段可控 registry: #其中前缀spring-cloud说明:挂载到 Spring Cloud注册中心 address: spring-cloud://www.onething.top:8848 #dubbo服务注册端口,注册中心服务器地址,如果地址没有端口缺省为9090,同一集群内的多个地址用逗号分隔,如:ip:port,ip:port cloud: subscribed-services: dubbo-product
(3)创建应用主类,并实现一个接口,在这个接口中调用Dubbo服务
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15@EnableDiscoveryClient @SpringBootApplication @RestController public class DubboClientApplication { @Reference HelloService helloService; public static void main(String[] args) { SpringApplication.run(DubboClientApplication.class, args); } @GetMapping("/test") public String test() { return helloService.hello("didispace.com"); } }
注意:这里的@Reference注解是org.apache.dubbo.config.annotation.Reference
最后
以上就是平常小虾米最近收集整理的关于SpringCloudAlibaba整合Dubbo构建服务接口构建服务接口提供方构建服务接口消费方的全部内容,更多相关SpringCloudAlibaba整合Dubbo构建服务接口构建服务接口提供方构建服务接口消费方内容请搜索靠谱客的其他文章。
发表评论 取消回复