Spring-Cloud-Alibaba与Dubbo的集成

前言

为什么要集成Dubbo

在我之前的文章提到过,spring-cloud-alibaba无缝的集成类feign组件,底层属于http调用,所以使用起来会非常灵活,
但是在性能上不及rpc,Dubbo正是一款高性能的rpc框架,有着良好的负载均衡与熔断降级特性,在微服务中也是一个非常流行的框架

集成方案

集成方案有多种,可以让zookeeper作为注册中心,然后把zookeeper集群集成到nacos中,或者直接让nacos作为注册中心,推荐后一种方式,因为阿里巴巴推出nacos的目的就是想代替zookeeper的方案

第一种:zookeeper作为注册中心

参考

zookeeper安装(推荐docker安装)

  • docker-compose.yaml
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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
version: '3.1'

services:
zoo1:
image: zookeeper
restart: always
hostname: zoo1
networks:
- zoo-net
ports:
- 2181:2181
volumes:
- zoo1-data:/data
- zoo1-log:/datalog
environment:
ZOO_MY_ID: 1
ZOO_SERVERS: server.1=0.0.0.0:2888:3888;2181 server.2=zoo2:2888:3888;2181 server.3=zoo3:2888:3888;2181
ZOO_4LW_COMMANDS_WHITELIST: "*"

zoo2:
image: zookeeper
restart: always
hostname: zoo2
networks:
- zoo-net
ports:
- 2182:2181
environment:
ZOO_MY_ID: 2
ZOO_SERVERS: server.1=zoo1:2888:3888;2181 server.2=0.0.0.0:2888:3888;2181 server.3=zoo3:2888:3888;2181
ZOO_4LW_COMMANDS_WHITELIST: "*"

zoo3:
image: zookeeper
restart: always
hostname: zoo3
networks:
- zoo-net
ports:
- 2183:2181
environment:
ZOO_MY_ID: 3
ZOO_SERVERS: server.1=zoo1:2888:3888;2181 server.2=zoo2:2888:3888;2181 server.3=0.0.0.0:2888:3888;2181
ZOO_4LW_COMMANDS_WHITELIST: "*"

volumes:
zoo1-data:
external: false
zoo1-log:
external: false

networks:
zoo-net:

第二种:直接以nacos作为注册中心

参考

nacos安装

点此跳转

公共接口项目

  • 就是一个简单的接口
    1
    2
    3
    public interface HelloService {
    public String sayHello(String name);
    }

服务提供者

  • 必要依赖
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-dubbo</artifactId>
</dependency>

<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

<!--接口项目-->
<dependency>
...
</dependency>
  • application.yaml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
dubbo:
protocol:
name: dubbo
port: -1
registry:
address: spring-cloud://jd
scan:
base-packages: com.zhubome.democommonservice4.service
cloud:
subscribed-services:


spring:
application:
name: alibaba-dubbo-server
cloud:
nacos:
discovery:
server-addr: jd:8848
  • 实现类
1
2
3
4
5
6
7
8
9
10
import com.zhubome.sca.dubbointerface.service.HelloService;
import org.apache.dubbo.config.annotation.Service;

@Service
public class HelloServiceImpl implements HelloService {
@Override
public String sayHello(String name) {
return "Hello " + name;
}
}
  • 启动类
1
2
3
4
5
6
7
8
9
10
11
12
13
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

@SpringBootApplication
@EnableDiscoveryClient
public class DemoCommonService4Application {

public static void main(String[] args) {
SpringApplication.run(DemoCommonService4Application.class, args);
}

}
  • 由于nacos默认注册内网ip,如有需要注册公网ip时,在运行jar包时把公网ip传入即可
script
1
java -jar -Dspring.cloud.nacos.discovery.ip=`hostname -i` -jar xxx.jar

前提是已做好hostname公网ip映射

服务消费者

  • 必要依赖
    与提供者同

  • application.yaml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
spring:
application:
name: sca-consumer-service
cloud:
nacos:
discovery:
server-addr: jd:8848

server:
port: 10107

dubbo:
protocol:
name: dubbo
port: -1
registry:
address: spring-cloud://jd
cloud:
subscribed-services: alibaba-dubbo-server
  • 调用类
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import com.zhubome.sca.dubbointerface.service.HelloService;
import org.apache.dubbo.config.annotation.Reference;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

@RestController
public class UserController {

@Reference
private HelloService helloService;

@GetMapping("/dubbo")
public String sayHello() {
System.out.println(helloService.sayHello("SnailClimb"));
return helloService.sayHello("world");
}
}