微服务之SpringCloud Alibaba(注册中心Nacos)

文章目录

一、微服务简介

1.什么是微服务

顾名思义,是一个微小的服务,为什么会说是"微"呢?意思整个服务的是比较微小的,是一个独立的业务模块,专做改业务的事情,是一个独立的功能单元。

一种独特的架构设计模式,它将是软件、web或移动应用拆分为一系列独立的服务一一如微服务。这些服务仅用于某一个特定的业务功能,例如:用户管理、用户角色、电子商务购物车、搜索引擎、社交媒体登录等。此外,它们是相互独立的,这意味着它们可以采用不同的编程语言和数据存储。微服务中几乎不存在集中管理,它使用轻量级的HTTP、REST来进行内部通信。

微服务之间有两种主流的调用方式一个是RPC另一个是OpenFeign

简单实现

中小公司一般这么写。

复杂实现

复杂实现一般都是大公司才这么写。

用户访问使用nginx做负载均衡分配请求

再到网关负载均衡分发处理到controller的用户管理C1/C2或者订单管理controller的controller层

除了上面这么多还有redis集群数据库分库分表等等。

2.RPC

RPC(RemoteProcessCall),即远程服务调用,被广泛地应用在很多企业应用中,是早期主要的服务治理方案,其流程较为简单,客户端consumer携带参数发送RPC请求到服务提供方provider,provider根据参数路由到具体函数,方法,并将执行获得的结果返回,至此一次RPC调用完成。

如上图的通过RPC连接消费者和生产者。一个模块既可以是生产者也可以是消费者,比如订单模块调用用户模块,此时订单模块就是消费者,用户模块就是生产者。反之订单模块就是生产者,用户模块就是消费者

3.SOA

由于简单的RPC调用已经不能随着时代发展满足需求,因此复杂的业务逻辑对于分布式应用架构体系的需求愈发强烈,业务希望自己的服务是分布式部署的请求是分流的对数据的操作是能读写分离的,同时能屏蔽许多复杂需要自己编写的底层服务,借助已有的公共服务,去快速的构建自己的应用,降低人力开发维护的成本和提高应用交付的效率,因此,基于分布式服务思想的SOA(Service-OrientedArchitecture)成了新的受追捧的架构。常见的SOA服务调用流程图如下:

网关可以理解为一个全局的过滤器。除了这个Gateway还有

4.服务治理方案

业界的互联网巨头公司,都有属于自己的分布式服务框架,如阿里巴巴的Dubbo,HSF,腾讯的Tars,京东的JSF,新浪的Motan,都已经是业界非常成熟的解决方案,其中开源的Dubbo和Motan受到了广大开发者的研究对象。

纵观这些服务框架,设计的基本思路都如上图,无非涉及provider发布注册,consumer订阅,调用发起,负载均衡,服务分流和监控等模块,并在此基础上增加了很多玩法,形成了各具特色的分布式服务框架设计,下面就Dubbo,JSF,Motan的设计做下简单的介绍。

5.分布式服务框架主要模块名词释义

  1. Provider:服务提供者,无论是业务服务,还是一个系统中公用的SAAS,都属于Provider
  2. Consumer:即发起调用的客户端
  3. Registry:服务注册中心,是分布式服务系统中的一个重要组成模块,管理Provider的Manager,在实际的运行环境中,服务注册中心Registry被动通知或Consumer主动询问,在Provider有节点宕机或新增节点时,客户端也可实时感知到,从而避免了某个Provider被无限调用或是无限闲置
  4. Gateway:网关也是分布式服务框架中不可或缺的部分,每种系统与框架都有自己的一套协议,当异构系统互相调用时,网关的作用即显现出来,GateWay接受各种外部HTTP请求,完成相应的权限校验,报文适配,路由转发到对应的Provider,再将Provider返回的结果传递给异构系统的Consumer,完成异构系统的互相调用
  5. 负载均衡,服务分流:Consumer从Registry获得具体的Provider列表后,如何选取合适的Provider,取决与一定的负载均衡算法,常见的算法有轮询法,随机法,源地址哈希,加权轮询,加权随机等
  6. 监控:接收来自Consumer和Provider异步上报的性能监控数据,对有风险的节点发出告警

6.为什么互联网项目会采用SOA架构呢?

随着互联网的发展,网站应用的规模不断扩大,常规的垂直应用架构已无法应对,分布式服务架构以及流动计算架构势在必行,追切需一个治理系统确保架构有条不的演进。

  • 单一应用架构:当网站流量很小时,只需一个应用,将所有功能都部署在一起,以减少部署节点和成本。此时,用于简化增删改查工作量的数据访问框架(ORM)是关键。
  • 垂直应用架构:当访问量逐渐增大,单一应用增加机器带来的加速度越来越小,将应用拆成互不相干的几个应用,以提升效率。此时,用于加速前端页面开发的Web框架(MVC)是关键。
  • 分布式服务架构:当垂直应用越来越多,应用之间交互不可避免,将核心业务抽取出来,作为独立的服务,逐渐形成稳定的服务中心,使前端应用能更快速的响应多变的市场需求。此时,用于提高业务复用及整合的分布式服务框架(RPC)是关键。
  • 流动计算架构:当服务越来越多,容量的评估,小服务资源的浪费等问题逐渐显现,此时需增加一个调度中心基于访问压力实时管理集群容量,提高集群利用率。此时,用于提高机器利用率的资源调度和治理中心(SOA)是关键。

常用实现远程通信的方案

  1. Webservice:效率不高基于soap协议。项目中不推荐使用。
  2. 使用restful形式的服务:http+json。很多项目中应用。如果服务太多,服务之间调用关系混乱,需要治疗服务。
  3. 使用dubbo/dubbox。使用rpc协议进行远程调用,直接使用socket通信。传输效率高,并且可以统计出系统之间的调用关系、调用次数。

7.注册中心

一个分布式服务框架,是ApacheHadoop的一个子项目,它主要是用来解决分布式应用中经常遇到的些数据管理问题,如:统一命名服务、状态同步服务、集群管理、分布式应用配置项的管理等。

CAP原则

  1. C(consistency):一致性,同一时刻的同一请求的实例返回结果相同,属于强一致性性,也就是说,在集群环境中,对外提供的服务信息是完全一致的,但是在效率上面可能会有一定的损耗;
  2. A(availability):可用性,所有实例的读写请求在一定的时间内可以得到正确的响应,它是弱一致性,可能在极短的时间内,不同实例获取到的信息是不一致的,但是服务可用并且最终数据是一致的;比如说注册中心的两个项目互相调用启动一个挂了也能调到(自我保护机制)。除非短时间大量节点失效我才会认为你出问题了
  3. P(Partition tolerance):分区容错性,在网络异常的情况下,仍l旧能够提供正常的响应,这是在微服务系统中必须要保证的;比如A调用B失败了,B会给A返回结果说B异常了。

和注册中心有关的有框架有三个:注册中心就是把项目放到注册中心就可互相调用了。

  1. zookeeper (2018年的项目用的多):cp模型,使用的调用方式是RPC
  2. SpringColud 中自带的注册中心(Eureka Server ):ap模型,使用的调用方式是Feign或者OpenFeignOpenFeign是Feign的升级版
  3. 阿里的Nacos(主流):它功能全面、社区活跃、与Spring Cloud生态结合最好,是当前事实上的标准。cp模型ap模型。使用的调用方式是RPC或者OpenFeign。我们使用OpenFeign,因为若依使用的OpenFeign。

8.常见微服务架构

  1. dubbo: zookeeper +dubbo + SpringMVC/SpringBoot
    配套 通信方式:rpc
    注册中心:zookeeper / redis
  2. SpringCloud:全家桶+轻松嵌入第三方组件(Netflix)
    配套 通信方式:http restful
    注册中心:eruka
    配置中心:config
    断 路 器:hystrix
    网关:zuul
    分布式追踪系统:sleuth + zipkin
  3. SpringCloud Alibaba

    我们服务中心使用nacos
    第一个服务调用是负载均衡
    第二个服务调用我们使用的是openFeign
    服务降级报错了怎么处理
    服务网关
    服务配置
    服务总线

二、Nacos是什么

nacos是spring cloud alibaba生态中非常重要的一个组件,它有两个作用:

1)注册与发现中心;

2)配置中心

nacos有注册中心的作用,我们常见的配置中心还有zk和eureka

官网:https://nacos.io/zh-cn/index.html

复制代码
微服务cap原则:
1、C(consistency):一致性,同一时刻的同一请求的实例返回结果相同,属于强一致性性,也就是说,在
集群环境中,对外提供的服务信息是完全一致的,但是在效率上面可能会有一定的损耗;
2、A(availability):可用性,所有实例的读写请求在一定的时间内可以得到正确的响应,它是弱一致性,
可能在极短的时间内,不同实例获取到的信息是不一致的,但是服务可用并且最终数据是一致的;
3、P(Partition tolerance):分区容错性,在网络异常的情况下,仍旧能够提供正常的响应,这是在微服
务系统中必须要保证的;

nacos在启动时,默认是AP模式,可以通过指令将nacos变为CP模式,在我们经常使用的微服务中,我们是选择使用AP模式的,此时的所有实例都属于临时实例。临时实例和持久实例最显著的区别就是在健康检查发现服务有问题时,持久实例被标注为不健康,而临时实例会直接剔除。

三、nacos的下载

nacos大体分为两部分:nacos服务端和nacos客户端,首先是nacos服务端 ,这一部分是不需要做任何改动,直接启动服务即可。有两种方式,一种是直接下载打包好的服务,直接通过命令运行即可;一种是下载nacos源码,然后进行启动(nacos是普通的spring boot项目)。

1. 直接下载打包服务

官网下载

第一步,去nacos官网下载对应环境的服务端项目,下载地址是:https://github.com/alibaba/nacos/releases,但是需要注意一点,目前在nacos官网(https://nacos.io/docs/next/quickstart/quick-start/)中,推荐使用的nacos版本是2.0.3

解压并打开目录

下载完毕以后进行解压(不要有中文路径),进入到bin目录

开命令行窗口输入cmd回车

输入指令

bash 复制代码
# 后缀standalone指的是以单例的方式进行启动
.\startup.cmd -m standalone

结果如下:

打开网址

打开网址http://192.168.108.11:8848/nacos/index.html 输入账号密码。账号密码都是nacos

2.源码方式启动(了解)

就是使用阿里的源码启动

下载源码https://github.com/alibaba/nacos 导入idea中。

启动类在console子项目中

四、创建nacos客户端

idea创建springboot项目。

创建idea项目


删除src

修改父级的pom文件

xml 复制代码
<project  ........>
  <!-- ........ -->
  <packaging>pom</packaging>
  <properties>
    .......
  </properties>
  
</project>

修改nacos到dependencyManagement下

复制代码
<dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
            </dependency>

新建子级模块

创建子级模块

创建bill-provider-7780

选择2.7.6然后添加依赖

修改子级的pom文件

下面的文件内容看着复制,不要全粘,否则可能报错

xml 复制代码
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.hsh</groupId>
    <artifactId>bill-provider-7780</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>bill-provider-7780</name>
    <description>bill-provider-7780</description>
    <!--  子级打包方式  -->
    <packaging>jar</packaging>
    <!--  引用父级  -->
    <parent>
        <groupId>com.hsh</groupId>
        <artifactId>cloud-alibaba-test</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>

    <dependencies>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
        <!-- 删除spring-boot-starter-web 和 spring-boot-starter-test -->

    </dependencies>

    <!-- 删除 <dependencyManagement>标签内的所有标签  -->

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.1</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                    <encoding>UTF-8</encoding>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>${spring-boot.version}</version>
                <configuration>
                    <mainClass>com.hsh.billprovider7780.BillProvider7780Application</mainClass>
                    <skip>true</skip>
                </configuration>
                <executions>
                    <execution>
                        <id>repackage</id>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

</project>

修改父级的pom.xml文件

xml 复制代码
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.hsh</groupId>
    <artifactId>cloud-alibaba-test</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>cloud-alibaba-test</name>
    <description>cloud-alibaba-test</description>
    <!--  指定打包方式  -->
    <packaging>pom</packaging>
    <!--  引用子级模块  -->
    <modules>
        <module>bill-provider-7780</module>
    </modules>
    <properties>
        <java.version>1.8</java.version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <spring-boot.version>2.6.13</spring-boot.version>
        <spring-cloud-alibaba.version>2021.0.5.0</spring-cloud-alibaba.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>
    <dependencyManagement>
        <dependencies>
            <!--  将上面的 dependencies中的 spring-cloud-starter-alibaba-nacos-discovery 放在这里-->
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
                <version>${spring-cloud-alibaba.version}</version>
            </dependency>
            <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>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>${spring-cloud-alibaba.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.1</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                    <encoding>UTF-8</encoding>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>${spring-boot.version}</version>
                <configuration>
                    <mainClass>com.hsh.cloudalibabatest.CloudAlibabaTestApplication</mainClass>
                    <skip>true</skip>
                </configuration>
                <executions>
                    <execution>
                        <id>repackage</id>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

</project>

整理子级文件夹

NacosDiscoveryConfiguration中的代码解释

java 复制代码
package com.hsh.billprovider7780.config;

import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.context.annotation.Configuration;

@EnableDiscoveryClient  // 开启nacos,这里也可以在启动类中配置
@Configuration
public class NacosDiscoveryConfiguration {

}

配置yml

application.properties重命名为application.yml

yml 复制代码
server:
  port: 7780
spring:
  application:
    name: bill-provider-7780 # 服务名
  cloud:
    nacos:
      discovery:
        username: nacos
        password: nacos
        server-addr: 127.0.0.1:8848

启动nacos

指令如下

bash 复制代码
# 后缀standalone指的是以单例的方式进行启动
.\startup.cmd -m standalone

启动项目

打开你的7780这个模块启动

idea的控制台出现BeanFactory id=xxxxx的东西就说明成功了

打开nacos图形化界面

浏览器输入http://192.168.108.11:8848/nacos/index.html结果如下

alibaba与boot对应版本

五、nacos集群配置

Nacos集群默认最小要有三个节点,而且三个节点的配置中心的数据都需要存储在MySQL数据库中。

在mysql中创建数据库nacos,并在nacos的conf目录下找到nacos-mysql.sql文件导入数据库

这三个集群要做到数据同步

运行sql文件

打开navicat新建数据库nacos_config

运行上面的nacos-mysql.sql文件结果如下

编辑application.properties文件配置

修改application.properties文件

修改数据库

找到如下数据库连接并修改连接信息

修改端口号为8848

复制三份nacos并重命名

复制三份,并给下面的端口号分别设置为为8848,8858,8868


注意:端口号不要连续,如8081,8082,8083。连续端口会报错。

编写cluster.conf文件

重命名

在conf目录下,修改文件名cluster.conf.example为cluster.conf

编写ip

编辑文件信息如下: IP(可使用ipconfig查看自己的IP地址)+端口号

复制代码
192.168.137.1:8848
192.168.137.1:8858
192.168.137.1:8868

本机ip可使用ipconfig指令查找

复制三份

将cluster.conf复制三份到nacos1nacos2nacos3

启动

后端

依次启动nacos1nacos2nacos3

进入bin目录下,双击启动startup.cmd (默认以集群模式启动)

注意:切记不要使用命令.\startup.cmd -m standalone 启动,需要以cluster模式启动。

如果三个窗口都出现Nacos started successfully in cluster mode. use external storage说明nacos集群部署成功

nacos的可视化窗口

输入地址(IP+端口号)

密码账号都是nacos/nacos登录

点击集群查看是否配置成功

启动IDEA项目注册服务(会发现3个nacos同步服务)

未完待续。。。。

请看下一篇博客微服务之OpenFeign 服务调用

相关推荐
Dolphin_Home17 小时前
从理论到实战:图结构在仓库关联业务中的落地(小白→中级,附完整代码)
java·spring boot·后端·spring cloud·database·广度优先·图搜索算法
Loo国昌18 小时前
Vue 3 前端工程化:架构、核心原理与生产实践
前端·vue.js·架构
tap.AI18 小时前
RAG系列(一) 架构基础与原理
人工智能·架构
The Open Group19 小时前
架构:不仅仅是建模,而是一种思维
架构
Mr.朱鹏20 小时前
SQL深度分页问题案例实战
java·数据库·spring boot·sql·spring·spring cloud·kafka
Solar202520 小时前
TOB企业智能获客新范式:基于数据驱动与AI的销售线索挖掘与孵化架构实践
人工智能·架构
winfield82121 小时前
关于工程实践的面试问题
微服务·面试
brzhang1 天前
A2UI:但 Google 把它写成协议后,模型和交互的最后一公里被彻底补全
前端·后端·架构
GIOTTO情1 天前
多模态媒体发布技术架构解析:Infoseek 如何支撑科技舆情的极速响应?
科技·架构·媒体