文章目录
Dubbo SpringCloud Nacos 入门案例
案例说明
Dubbo SpringCloud Nacos
入门案例会基于SpringCloudAlibaba 企业级应用实战:基于Nacos 实现服务发现工程来实现。
定义 dubbo 服务接口
public interface IAccountService {
public Object register(String name);
}
Dubbo 服务接口是服务提供方与消费方的远程通讯契约,为了确保契约的一致性,推荐的做法是将 Dubbo 服务接口打包在第二方或者第三方的 artifact(jar)中。上述接口,存放于sca-account-api
工程中。dubbo
服务提供方需要引入sca-account-api
依赖,并实现服务接口,dubbo
服务消费者同样需要引入sca-account-api
依赖,并以接口调用的方式实现远程方法调用。
实现 dubbo 服务提供方
dubbo
服务提供方是一个独立微服务工程,需要引入sca-account-api
依赖,并实现dubbo
服务接口。本例中sca-account-service
作为dubbo
服务提供方。
添加Dubbo Spring Cloud 依赖
<!-- dubbo 服务接口 -->
<dependency>
<groupId>cn.tyrone.sca</groupId>
<artifactId>sca-account-api</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!-- Dubbo Spring Cloud Starter -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-dubbo</artifactId>
</dependency>
实现 Dubbo 服务接口
@org.apache.dubbo.config.annotation.Service
public class AccountServiceImpl implements IAccountService {
public Object register(String name) {
return name;
}
}
Dubbo 服务提供者配置
server.port=7000
spring.application.name=sca-account-service
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
spring.main.allow-bean-definition-overriding=true
management.endpoints.web.exposure.include=*
dubbo.scan.base-packages=cn.tyrone.sca
dubbo.protocol.name=dubbo
dubbo.protocol.port=-1
dubbo.registry.address=spring-cloud://localhost
配置文件说明:
- dubbo.scan.base-packages : 指定 Dubbo 服务实现类的扫描基准包
- dubbo.protocol : Dubbo 服务暴露的协议配置,其中子属性 name 为协议名称,port 为协议端口( -1 表示自增端口,从 20880 开始)
- dubbo.registry : Dubbo 服务注册中心配置,其中子属性 address 的值 “spring-cloud://localhost”,说明挂载到 Spring Cloud 注册中心
当前 Dubbo Spring Cloud 实现必须配置 dubbo.registry.address = spring-cloud://localhost,下一个版本将其配置变为可选。当前版本:
2.1.1.RELEASE
。
- 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 服务器主机和端口
Dubbo 服务提供者启动类
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
@SpringBootApplication
@EnableDiscoveryClient
public class ScaAccountServiceApplication implements CommandLineRunner {
Logger logger = LoggerFactory.getLogger(this.getClass());
public static void main(String[] args) {
SpringApplication.run(ScaAccountServiceApplication.class, args);
}
public void run(String... args) throws Exception {
logger.info("-------------- 账户应用服务提供者-启动成功 --------------");
}
}
实现 Dubbo 服务消费方
dubbo
服务消费方是一个独立微服务工程,需要引入sca-account-api
依赖,并通过接口调用方式调用远程接口。本例中sca-account-consumer
作为dubbo
服务提供方。
添加Dubbo Spring Cloud 依赖
<!-- dubbo 服务接口 -->
<dependency>
<groupId>cn.tyrone.sca</groupId>
<artifactId>sca-account-api</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!-- Dubbo Spring Cloud Starter -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-dubbo</artifactId>
</dependency>
Dubbo 服务消费方配置
server.port=7001
spring.application.name=sca-account-consumer
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
spring.main.allow-bean-definition-overriding=true
dubbo.scan.base-packages=cn.tyrone.sca
dubbo.protocol.name=dubbo
dubbo.protocol.port=-1
dubbo.registry.address=spring-cloud://localhost
dubbo.cloud.subscribed-services=sca-account-service
配置说明:
服务消费方配置增加dubbo.cloud.subscribed-services
属性,属性说明如下
- dubbo.cloud.subscribed-services : 用于服务消费方订阅服务提供方的应用名称的列表,若需订阅多应用,使用 “,” 分割。 不推荐使用默认值为 “*”,它将订阅所有应用。
Dubbo远程服务调用
import cn.tyrone.sca.account.service.IAccountService;
import org.apache.dubbo.config.annotation.Reference;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.client.RestTemplate;
@RestController
public class AccountConsumerController {
@Reference private IAccountService accountService;
@GetMapping("/register")
public Object register(String name){
Object object = accountService.register(name);
return object;
}
}
Dubbo服务消费方启动类
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;
@SpringBootApplication
@EnableDiscoveryClient
public class AccountConsumerApplication implements CommandLineRunner {
Logger logger = LoggerFactory.getLogger(this.getClass());
public static void main(String[] args) {
SpringApplication.run(AccountConsumerApplication.class, args);
}
public void run(String... args) throws Exception {
logger.info("-------------- 账户应用服务消费者-启动成功 --------------");
}
@LoadBalanced
@Bean
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
测试步骤
- 启动
Nacos
服务发现 - 分别启动
Dubbo
服务提供方和Dubbo
服务消费方。
服务启动成功后,可以在Nacos
控制台看到服务列表,如下图:
浏览器输入:http://localhost:7001/register?name=tyrone
。HTTP
的响应是name
的值:tyrone。如下图:
引用
源代码链接:https://github.com/myNameIssls/spring-cloud-alibaba-study/tree/master/sca-dependences/sca-account