1、Spring Cloud Dubbo
从上一篇文章中可以 get 到分布式微服务中的两种调用方式,现在的 dubbo 为第三种,三种方式的比较,网上有很多分析,这里就不一一阐述了
-
@LoadBalanced + RestTemplate -
Spring Cloud OpenFeign -
Spring Cloud Dubbo
同样也是使用的生产者,消费者模式。其中多了一个 API 模块,API 模块,存放 Dubbo 服务接口和模型定义,非必要,这里创建仅为更好的代码重用以及接口、模型规格控制管理
其实玩过 Dubbo + Zookeeper 的都知道,使用 Dubbo 调用的前提是,生产者消费者两端有同样的约束
2、构建 Dubbo 公共 API
创建 spring-cloud-alibaba-dubbo-api 模块,这个模块只需要使用普通的 java 模块即可,主要是使用统一的接口管理,创建一个 service 接口层
package cn.tellsea.service;
/**
* 公共API
*
* @author Tellsea
* @date 2021/12/20
*/
public interface EchoService {
/**
* dubbo 公共 API
*
* @param message
* @return
*/
String echo(String message);
}
构建完 spring-cloud-alibaba-dubbo-api 模块之后,需要使用命令打包
mvn clean install
构建 Dubbo 生产者和消费者的时候,需要使用这个依赖
3、构建 Dubbo 生产者
创建 spring-cloud-alibaba-dubbo-provider 模块,相关依赖,其中 spring-cloud-alibaba-dubbo-api 是上一步构建的 jar 包安装到了本地
<dependencies>
<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>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-dubbo</artifactId>
</dependency>
<dependency>
<groupId>cn.tellsea</groupId>
<artifactId>spring-cloud-alibaba-dubbo-api</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
修改 application.properties 配置,增加 dubbo 配置
server.port=8083
spring.application.name=spring-cloud-alibaba-dubbo-provider
management.server.port=9093
management.endpoints.jmx.exposure.include=*
management.endpoints.web.exposure.include=*
management.endpoint.health.show-details=always
# Nacos注册信息
spring.cloud.nacos.discovery.server-addr=localhost:8848
spring.cloud.nacos.discovery.username=nacos
spring.cloud.nacos.discovery.password=nacos
spring.cloud.nacos.discovery.namespace=sandbox-configuration
# dubbo 协议
dubbo.protocol.id=dubbo
# dubbo 协议端口( -1 表示自增端口,从 20880 开始)
dubbo.protocol.port=-1
# dubbo 服务扫描基准包
dubbo.scan.base-packages=cn.tellsea.service
启动类增加注册服务
@EnableDiscoveryClient
然后再创建一个实现类,实现 API 中的接口
package cn.tellsea.service;
import org.apache.dubbo.config.annotation.Service;
/**
* Service注解仅声明该Java服务(本地)实现为Dubbo服务
*
* @author Tellsea
* @date 2021/12/20
*/
@Service
public class SimpleEchoServiceImpl implements EchoService {
@Override
public String echo(String message) {
return "[ECHO] " + message;
}
}
到这里服务提供者就构建完成了, 看一下 nacos 检查一下是否注册成功
4、构建 Dubbo 消费者
创建 spring-cloud-alibaba-dubbo-consumer 模块,依赖和生产者的一样
<dependencies>
<dependency>
<groupId>cn.tellsea</groupId>
<artifactId>spring-cloud-alibaba-dubbo</artifactId>
<version>0.0.1-SNAPSHOT</version>
</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>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-dubbo</artifactId>
</dependency>
<dependency>
<groupId>cn.tellsea</groupId>
<artifactId>spring-cloud-alibaba-dubbo-api</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
然后修改 application.properties 配置信息,这里的 dubbo 只需要订阅服务就可以
server.port=8084
spring.application.name=spring-cloud-alibaba-dubbo-consumer
management.server.port=9094
management.endpoints.jmx.exposure.include=*
management.endpoints.web.exposure.include=*
management.endpoint.health.show-details=always
# Nacos注册信息
spring.cloud.nacos.discovery.server-addr=localhost:8848
spring.cloud.nacos.discovery.username=nacos
spring.cloud.nacos.discovery.password=nacos
spring.cloud.nacos.discovery.namespace=sandbox-configuration
# dubbo 协议
dubbo.protocol.id=dubbo
# dubbo 协议端口( -1 表示自增端口,从 20880 开始)
dubbo.protocol.port=-1
# Dubbo 消费端订阅服务端的应用名,多个服务提供者用逗号分隔
dubbo.cloud.subscribed-services=spring-cloud-alibaba-dubbo-provider
然后编写测试的调用方法
package cn.tellsea;
import cn.tellsea.service.EchoService;
import org.apache.dubbo.config.annotation.Reference;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
/**
* spring cloud dubbo 消费者
*
* @author Tellsea
* @date 2021/12/20
*/
@EnableDiscoveryClient
@RestController
@SpringBootApplication
public class SpringCloudAlibabaDubboConsumerApplication {
@Reference
private EchoService echoService;
@GetMapping("/echo/{message}")
public String echo(@PathVariable("message") String message) {
return echoService.echo(message);
}
public static void main(String[] args) {
SpringApplication.run(SpringCloudAlibabaDubboConsumerApplication.class, args);
}
}
启动服务,查看 nacos 是否注册成功
http://localhost:8084/echo/123456
返回结果
[ECHO2] 123456
至此,Spring Cloud Dubbo 分布式服务调用完成
微信公众号
原文始发于微信公众号(花海里):【Spring Cloud Alibaba】Dubbo 分布式服务调用
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/69507.html