SpringCloudAlibaba基础实战(Dubbo+Nacos 服务注册与发现篇)
Posted adventure.Li
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SpringCloudAlibaba基础实战(Dubbo+Nacos 服务注册与发现篇)相关的知识,希望对你有一定的参考价值。
一、背景
在云原生时代,微服务、容器技术、DevOps,持续交付是四大元素。而对于开发人员微服务的掌握是重中之重。Java中SpringBoot凭借优秀的特性为构造Java应用带来了极大便利。因此,微服务构建是SpringCloud利用其生态,很好地建立起来SpringCloud系列的架构解决方案。而SpringCloud Netfflix由于停更,SpringCloudAlibaba凭借对第一代的兼容性以及极好的功能拓展、便利性提升,而占据了Java微服务较大市场。微服务的整个架构和SpringCloudAlibaba生态如下,而本文将进行一些简单Demo的实战记录,相关代码放在个人github。
二、服务注册&发现
我们都知道微服务将应用的粒度划分很小,便于协作开发和故障迁移。那么粒度变小之后,必然服务的数量上来了,而且服务间也存在着一定关系,需要去调用,此刻微服务一般还部署在不同机器之上,因此不能像本地调用那样去调用,而需要通过网络通信方式去调用。因此复杂度瞬间上来,我们主要就需要去考虑以下复杂度:
- 服务调用与治理(如何保证复用的可用?对于大规模的服务如何治理、跟踪?
- 服务的通信如何高效,通信带来的系列问题(如超时,一个服务调用失败导致其他服务雪崩式失败
- 服务本身的健康状态(当服务本身不可用时如何处理?
对于上面的系列问题,我定义为 多 的问题,相比 单体(少),我们无需协作管理,而对于 多,就犹如 人群 形成 了社会,此时我们则需要进行管理,而对于多的管理在计算机中有很多体现,例如:
- 进程\\线程的多,带来了进程管理,高并发的协作问题
- 文件\\数据的多,带来了文件管理,数据库系统
- 人\\用户的多,带来了业务的管理,软件的管理(软件的复杂,来源于需求业务的复杂,人的需求)
所以说,解决该问题,我们也可如法炮制,采用中心机构进行管理。而微服务具体的管理方式,则是通过服务注册中心进行统一管理。有了统一的注册列表和各服务的信息,那么想去调用其他服务,检查服务状态等就更加容易,而对于常用的服务调用则是采用 REST Http通信和 RPC远程调用两种主要方式。
- REST :采用HTTP轻量级调用方式,十分方便,快捷,但是相对于RPC方式一般速度较慢,性能较差。
- RPC:远程调用,Java一般采用Netty通信框架,高性能的NIO底层,通信速度较快,性能较好。
对于SpringCloudAlibaba,RPC调用框架,Dubbo是一款高性能、轻量级的开源Java RPC框架,它提供了三大核心能力:面向接口的远程方法调用,智能容错和负载均衡,以及服务自动注册和发现。更多特性可以参考官网
对于SpringCloudAlibaba,服务注册与发现、配置中心,nacos具有很强的表现,随着2.0版本 gRpc的引入,通信性能极强,支撑百万实例。Nacos 支持几乎所有主流类型的“服务”的发现、配置和管理:
- Kubernetes Service
- gRPC & Dubbo RPC Service
- Spring Cloud RESTful Service
Dubbo+Nacos简单实战Demo
基本依赖
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.3.0.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.2.1.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
结构目录
具体过程
- 在cloud-demo-discovery-dubbo-api模块中定义统一接口
- 创建cloud-demo-discovery-dubbo-provier
- 引入依赖
<dependencies>
<dependency>
<groupId>org.example</groupId>
<artifactId>cloud-demo-discovery-dubbo-api</artifactId>
<version>1.0-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>
</dependencies>
- 写配置(要细致)
server:
port: 8888
spring:
application:
name: cloud-demo-discovery-dubbo-provider
cloud:
nacos:
discovery:
server-addr: localhost:8848
#dubbo:
# registry:
# address:
#dubbo:
# cloud:
# subscribed-services:
dubbo:
application:
#
id: cloud-demo-discovery-dubbo-provider
scan:
# 服务扫描基础包
base-packages: com.lyf.dubboprovider
# org.springframework.cloud.alibaba.dubbo.bootstrap
protocol:
# 协议
name: dubbo
# dubbo协议端口(-1自增端口,从20880开始)
port: -1
cloud:
subscribed-services: '*'
- 实现服务
/**
* @author liyunfei
*/
// dubbo贡献给apache了
//@Service
@Service
public class EchoServiceImpl implements EchoService
private final static Logger LOGGER = LoggerFactory.getLogger(EchoServiceImpl.class);
// publishProvider interfaceName is empty
@Override
public String echo(String msg)
//org.apache.dubbo.rpc.service.EchoService
LOGGER.info("[provider]"+msg);
return "provider provide fun:receive msg:"+msg;
- 启动类
@EnableDiscoveryClient
@SpringBootApplication
//@EnableDubbo
public class DemoDubboProviderApp
public static void main(String[] args)
SpringApplication.run(DemoDubboProviderApp.class,args);
- 创建cloud-demo-discovery-dubbo-consummer
- 引入依赖(同provider)
- 配置文件
server:
port: 8900
spring:
application:
name: cloud-demo-discovery-dubbo-consumer
cloud:
nacos:
discovery:
server-addr: localhost:8848
# nacos registry, DEFAULT_GROUP cloud-demo-discovery-dubbo-provider 192.168.247.1:8888 register finished
dubbo:
application:
id: cloud-demo-discovery-dubbo-consumer
cloud:
# 订阅服务提供者, * 提供所有
subscribed-services: cloud-demo-discovery-dubbo-provider
- 服务调用
@RestController
public class CallController
private final static Logger LOGGER = LoggerFactory.getLogger(CallController.class);
//@Reference
@Reference(check = false)
EchoService echoService;
@GetMapping("/call/test/msg")
String test(@PathVariable("msg")String msg)
LOGGER.info("[consumer]"+msg);
return echoService.echo(msg);
- 启动类
@EnableDiscoveryClient
@SpringBootApplication
@EnableDubbo
public class DemoDubboConsumerApp
public static void main(String[] args)
SpringApplication.run(DemoDubboConsumerApp.class,args);
- 启动nacos(单机版)
5. 依次启动provider,consumer,并进行接口调用测试
以上是关于SpringCloudAlibaba基础实战(Dubbo+Nacos 服务注册与发现篇)的主要内容,如果未能解决你的问题,请参考以下文章
SpringCloudAlibaba商城实战项目(day01)