目录
今天与大家们简单的聊一下,单体应用程序与分布式应用程序的基本逻辑原理,大家知道什么是Nacos注册中心吗?怎么使用nacos注册服务消费者与生产者?不急,接下来我将带您稍微认识一下Nacos注册中心与它的作用。。如果有问题,还望告知。
1. 应用系统架构的演变(单应用=>分布式)
单应用架构 -> 应用服务器和数据库服务器分离 -> 应用服务器集群 -> 数据库压力变大,数据库读写分离 ->
引入缓存机制缓解数据库的压力 -> 数据库的水平/垂直拆分(数据库分库分表) -> 应用的拆分(微服务)
从系统架构上可以大体分为两种:单体应用, 分布式应用
1)单体应用
缺陷:
- 启动速度慢,一个进程包含了所有的业务逻辑,涉及到的启动模块过多,导致系统的启动、重启时间周期过长
- 模块耦合度高,迭代速度慢,修改难度大
- 系统错误隔离性差,任何一个模块的错误均可能造成整个系统的宕机
- 可伸缩性差,系统的扩容只能只对这个应用进行扩容,不能做到对某个功能点进行扩容
优点:
- 容易部署,整个项目就一个war包,部署特别方便
- 容易运行,只要启动一个war应用就可以了
2)分布式应用
缺点:
- 可维护性差;应用流程常常垮多个微服务,不易进行问题的定位
- 开发难度大;垮服务的调用通常是不同的机器,甚至是不同的机房,开发人员需要处理超时、网络异常等问题
- 应用级别的需求变动常常波及多个服务
优点:
- 分而治之;单个服务功能内聚,复杂性低;方便团队的拆分和管理
- 可伸缩;能够单独的对指定的服务进行伸缩
- 迭代周期短;支持快速的迭代开发
- 独立部署,独立开发
常用的微服务分布式框架:
1)dubbo: 阿里开源的微服务框架,
2)springcloud: 基于spring,springboot的开源微服务框架
2. Spring Cloud Alibaba介绍
2018 年 10 月 31 日的凌晨,Spring Cloud Alibaba 正式入驻了 Spring Cloud 官方孵化器,并在 Maven 中央库发布了第一个版本。Spring Cloud Alibaba 致力于提供微服务开发的一站式解决方案。
此项目包含开发分布式应用服务的必需组件,方便开发者通过 Spring Cloud 编程模型轻松使用这些组件来开发分布式应用服务。依托 Spring Cloud Alibaba,您只需要添加一些注解和少量配置,就可以将 Spring Cloud 应用接入阿里分布式应用解决方案,通过阿里中间件来迅速搭建分布式应用系统** 主要功能包括:**
- 服务限流降级:默认支持 Servlet、Feign、RestTemplate、Dubbo 和 RocketMQ 限流降级功能的接入,可以在运行时通过控制台实时修改限流降级规则,还支持查看限流降级 Metrics 监控。
- 服务注册与发现:适配 Spring Cloud 服务注册与发现标准,默认集成了 Ribbon 的支持。
- 分布式配置管理:支持分布式系统中的外部化配置,配置更改时自动刷新。
- 消息驱动能力:基于 Spring Cloud Stream 为微服务应用构建消息驱动能力。
- 分布式事务:使用 @GlobalTransactional 注解, 高效并且对业务零侵入地解决分布式事务问题。。
- 阿里云对象存储:阿里云提供的海量、安全、低成本、高可靠的云存储服务。支持在任何应用、任何时间、任何地点存储和访问任意类型的数据。
- 分布式任务调度:提供秒级、精准、高可靠、高可用的定时(基于 Cron 表达式)任务调度服务。同时提供分布式的任务执行模型,如网格任务。网格任务支持海量子任务均匀分配到所有 Worker(schedulerx-client)上执行。
- 阿里云短信服务:覆盖全球的短信服务,友好、高效、智能的互联化通讯能力,帮助企业迅速搭建客户触达通道
注意组件
- Sentinel:把流量作为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性
- Nacos:一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。
- RocketMQ:一款开源的分布式消息系统,基于高可用分布式集群技术,提供低延时的、高可靠的消息发布与订阅服务
- Dubbo:Apache Dubbo 是一款高性能 Java RPC 框架
- Seata:阿里巴巴开源产品,一个易于使用的高性能微服务分布式事务解决方案
- Alibaba Cloud ACM:一款在分布式架构环境中对应用配置进行集中管理和推送的应用配置中心产品
- Alibaba Cloud OSS: 阿里云对象存储服务(Object Storage Service,简称 OSS),是阿里云提供的海量、安全、低成本、高可靠的云存储服务。您可以在任何应用、任何时间、任何地点存储和访问任意类型的数据
- Alibaba Cloud SchedulerX: 阿里中间件团队开发的一款分布式任务调度产品,提供秒级、精准、高可靠、高可用的定时(基于 Cron 表达式)任务调度服务
- Alibaba Cloud SMS: 覆盖全球的短信服务,友好、高效、智能的互联化通讯能力,帮助企业迅速搭建客户触达通道
3. 开发示例
3.1 版本的选择
springcloud基于springboot,两者之间的版本是有相关性的,不同的springcloud版本需要相对应的springboot版本支持。
3.2 nacos安装
nacos官网
从官网上下载nacos,解压到一个目录即可,在运行前请确定正确安装了jdk1.8或以上版本,正确配置了JAVA_HOME。
来到安装目录运行startup.cmd即可启动.
3.3 创建工程
3.3.1 创建父工程
创建一个maven工程,该工程为父工程,不需要src目录,可以将其删除。编写pom.xml文件导入必要的依赖。
<properties>
<spring-boot.version>2.3.2.RELEASE</spring-boot.version>
<spring-cloud.version>Hoxton.SR8</spring-cloud.version>
<spring-cloud-ali.version>2.2.3.RELEASE</spring-cloud-ali.version>
<spring-cloud-ali-nacos.version>1.3.3</spring-cloud-ali-nacos.version>
<spring-cloud-openfeign.version>2.2.2.RELEASE</spring-cloud-openfeign.version>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<hibernate.version>5.1.0.Final</hibernate.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring-boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>${spring-cloud-ali.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>${hibernate.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
<version>${spring-cloud-openfeign.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
3.3.2 创建服务提供者模块
1)加入必要的依赖包:
<dependencies>
<!-- 提供web能力 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- 从注册中心进行服务发现 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!-- 向注册中心进行服务注册 -->
<dependency>
<groupId>com.alibaba.nacos</groupId>
<artifactId>nacos-client</artifactId>
</dependency>
<!-- 用于数据校验 -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
</dependency>
</dependencies>
2)创建完成模块后,创建模块的目录结构, 如下图:
# 服务端口号
server.port=8070
# 服务名称
spring.application.name=service-provider
# nacos中ip和端口号
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
3)编写启动类
4)启动服务,查看注册中心
nacos控制台 http://localhost:8848/nacos/
默认用户名:nacos,密码:nacos
5)创建一个服务
创建一个简单的服务提供者,向外提供restful服务,用于演示服务间的调用。
@RestController
class EchoController {
@RequestMapping(value = "/echo/{string}", method = RequestMethod.GET)
public String echo(@PathVariable String string) {
System.out.println("服务提供者.........");
return "Hello Nacos Discovery " + string;
}
}
3.3.2 服务消费者
创建服务消费者模块,具体操作和服务提供者相同。
1)导入依赖包:
<dependencies>
<!-- 提供web能力 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- 声明式服务调用 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<!-- 从注册中心进行服务发现 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!-- 向注册中心进行服务注册 -->
<dependency>
<groupId>com.alibaba.nacos</groupId>
<artifactId>nacos-client</artifactId>
</dependency>
</dependencies>
2)创建模块结构及配置文件
在配置文件中配置了服务端口号,服务吗,及nacos服务IP及端口号。
3)创建启动类
@SpringBootApplication
@EnableDiscoveryClient
public class ConsumerApp {
public static void main(String[] args) {
SpringApplication.run(ConsumerApp.class, args);
}
}
启动服务,查询nacos控制台:
4)开发一个服务,调用服务提供者提供的服务
@LoadBalanced
@Bean
public RestTemplate restTemplate() {
return new RestTemplate();
}
@RestController
public class TestController {
private final RestTemplate restTemplate;
@Autowired
public TestController(RestTemplate restTemplate) {this.restTemplate = restTemplate;}
@RequestMapping(value = "/echo/{str}", method = RequestMethod.GET)
public String echo(@PathVariable String str) {
System.out.println("服务消费者 .......... ");
return restTemplate.getForObject("http://service-provider/echo/" + str, String.class);
}
}
3.4 测试
1)启动nacos,服务提供者,服务消费者
2)调用服务消费者他的echo服务,http://localhost:8080/echo/hello word,输出如下信息说明服务正常。