SpringCloudAlibaba入门,Nacos注册与配置,Sentinel服务治理

在前段时间为大家分享了SpringCloudAlibaba微服务项目实战的课程,可是有很多同学反馈,我根本这方面不太了解,能不能有个普及教程呢,那么今天来了,为大家分享一个SpringCloudAlibaba的基础入门教程,在配合项目实战教程学习就更容易入手啦!

本期将会为大家带来什么?

第一章:SpringCloudAlibaba简述

第二章:基于Nacos构建分布式注册中心

第三章:基于Nacos构建分布式配置中心

第四章:Sentinel服务治理

第一章:SpringCloudAlibaba简述

微服务架构演变历程

传统单体架构

单体架构在小微企业比较常见,典型代表就是一个应用、一个数据库、一个web容器就可以跑起来。

SpringCloudAlibaba入门,Nacos注册与配置,Sentinel服务治理


SOA架构(面向服务)

随着单体架构应用业务越来越复杂,开始对应用进行水平拆分、垂直拆分,慢慢的下沉的就成了基础组件,上浮的就成了业务系统,架构的本质就是不断的拆分重构:分的过程是把系统拆分为各个子系统/模块/组件,拆的时候,首先要解决每个组件的定位问题,然后才能划分彼此的边界,实现合理的拆分。合就是根据最终要求,把各个分离的组件有机整合在一起。拆分的结果使开发人员能够做到业务聚焦、技能聚焦,实现开发敏捷,合的结果是系统变得柔性,可以因需而变,实现业务敏捷。

SOA架构是一套松耦合的架构,服务的拆分原则是服务内部高内聚,服务之间低耦合。

微服务架构

微服务架构目前并没有一个严格的定义,

微服务架构是一种架构模式,它提倡将单一应用程序划分成一组小的服务,服务之间互相协调,互相配合,为用户提供最终价值。每个服务运行在其独立的进程中,服务与服务间采用轻量级的通信机制互相沟通,每个服务都围绕着具体业务进行构建,并且能够被独立部署到生产环境,类生产环境等。

  • 单一职责,对于每个服务而言,其处理的业务逻辑能够单一。
  • 轻量级通信,通常基于HTTP,能让服务间通信变得标准化,无状态化,REST是轻量级通信机制
  • 独立性,应用交付过程中,开发,测试以及部署保持独立
  • 进程隔离

简单来说,微服务架构是 SOA 架构思想的一种扩展,更加强调服务个体的独立性、拆分粒度更小

微服务的好处有:服务独立、扩展性好、可靠性强,但同时,也面临一些新的问题,比如运维复杂性,分布式复杂性、监控复杂性等等。

SOA架构与微服务架构之间的对比

SOA微服务企业级,自顶向下开展实施团队级,自底向上开展实施由多个子系统组成,粒度大拆分成多个服务,粒度细企业服务总线,集中式的服务架构无集中式总线,松散的服务架构集成方式复杂(ESB/WS/SOAP)集成方式简单(HTTP/REST/JSON)相互依赖,部署复杂服务独立部署

SpringCloud与SpringCloudAlibaba

pringCloud是基于SpringBoot的一整套实现微服务的框架。它提供了微服务开发所需的配置管理、服务发现、断路器、智能路由、微代理、控制总线、全局锁、决策竞选、分布式会话和集群状态管理等组件。最重要的是,基于SpringBoot,会让开发微服务架构非常方便。

Spring Cloud Alibaba中的开源组件都直指Netflix OSS中的重要组件,Eureka 已经闭源,Hystrix已经不再更新,所以自Spring Cloud Alibaba发布第一个Release以来,就备受国内开发者的高度关注。虽然Spring Cloud Alibaba还没能纳入Spring Cloud的主版本管理,但是毕竟拥有阿里的背景。

Spring Cloud 加盟重量级成员Spring Cloud Alibaba,打造更符合中国国情的微服务体系

本次课程我们将会介绍由 SpringCloudAlibaba 提供的开源组件 Nacos 及 Sentinel

基于Nacos构建分布式注册中心

分布式服务注册中心概念

概念
  • 服务注册:每个服务在启动的时候,告诉注册中心自己的位置信息。
  • 服务发现:商品服务想要调用订单服务,先找注册中心获取到所有服务的位置信息,然后找到订单服务的的址,发起调用。
  • 心跳机制:服务启动之后,每过30秒向注册中心心跳一次(就是发送一个消息,告诉注册中心自己还活着),如果注册中心长时间没有收到某个服务的信息,那么就会认为这个服务已经宕机,就从服务注册列表中删除。

Nacos简介

Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。

Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。Nacos 是构建以“服务”为中心的现代应用架构 (例如微服务范式、云原生范式) 的服务基础设施。

中文文档:
https://nacos.io/zh-cn/docs/what-is-nacos.html

Nacos安装

下载地址:
https://github.com/alibaba/nacos/releases

本文版本:1.2.1

下载完成之后,解压,在 bin 目录下有启动程序。

  • window:startup.cmd
  • linux:startup.sh

启动之后,访问
http://localhost:8848/nacos/,进入 Nacos 的登录界面,默认用户名密码为:nacos,登录之后进入管理界面

SpringCloudAlibaba入门,Nacos注册与配置,Sentinel服务治理

构建应用接入 Nacos

构建一个服务提供者以及一个服务消费者来验证服务的注册与发现

构建服务提供者

需要有 SpringBoot 基础

第一步:创建一个新的 SpringBoot 应用,命名为 nacos-provider

第二步:添加依赖

添加父依赖

<code>

<

parent

>

<

groupId

>

org.springframework.boot

groupId

>

<

artifactId

>

spring-boot-starter-parent

artifactId

>

<

version

>

2.0.5.RELEASE

version

>

<

relativePath

/>

parent

>

/<code>

添加依赖管理器

<code>

<

dependencyManagement

>

<

dependencies

>

<

dependency

>

<

groupId

>

org.springframework.cloud

groupId

>

<

artifactId

>

spring-cloud-dependencies

artifactId

>

<

version

>

Finchley.SR1

version

>

<

type

>

pom

type

>

<

scope

>

import

scope

>

dependency

>

<

dependency

>

<

groupId

>

org.springframework.cloud

groupId

>

<

artifactId

>

spring-cloud-alibaba-dependencies

artifactId

>

<

version

>

0.2.2.RELEASE

version

>

<

type

>

pom

type

>

<

scope

>

import

scope

>

dependency

>

dependencies

>

dependencyManagement

>

/<code>
<code>添加依赖

<

dependencies

>

<

dependency

>

<

groupId

>

org.springframework.boot

groupId

>

<

artifactId

>

spring-boot-starter-web

artifactId

>

dependency

>

<

dependency

>

<

groupId

>

org.springframework.cloud

groupId

>

<

artifactId

>

spring-cloud-starter-alibaba-nacos-discovery

artifactId

>

dependency

>

<

dependency

>

<

groupId

>

org.projectlombok

groupId

>

<

artifactId

>

lombok

artifactId

>

<

optional

>

true

optional

>

dependency

>

dependencies

>

/<code>

第三步:创建启动类并提供一个应用接口

<code>EnableDiscoveryClient
 

public

class

Application

{

public

static

void

main

(String[] args)

{ SpringApplication.run(Application

.

class

,

args

)

; } 4j

static

class

TestController

{ (

"/hello"

)

public

String

hello

(@RequestParam String name)

{ log.info(

"execute hello method with name : "

+ name);

return

"hello "

+ name; } } }/<code>
  • @SpringBootApplication 用于定义 SpringBoot 应用的启动类
  • @EnableDiscoveryClient Spring Cloud 提供的注解,用于开启 Spring Cloud 的服务注册与发现,由于这里引入了 spring-cloud-starter-alibaba-nacos-discovery,所以服务注册与发现会使用 Nacos 的实现。这与 Eureka 或者 Consul 的操作是一样的。

第四步:配置服务名称及 Nacos 地址

<code>

server:

  

port:

 

8080

spring:

  

application:

    

name:

nacos-provider

  

cloud:

    

nacos:

      

discovery:

        

server-addr:

 

127.0

.0

.1

:8848

/<code>

第五步:启动应用

如果打印如下日志,表示注册成功

<code>

nacos

registry

,

nacos-provider

10

.32

.52

.236

:8080

register

finished

/<code>

修改端口号,同一个应用启动多个实例,实现集群

访问 Nacos 管理界面,通过 服务管理 \> 服务列表 界面查看已注册的服务

SpringCloudAlibaba入门,Nacos注册与配置,Sentinel服务治理

点击详情,可以查看集群中每个服务实例的具体信息

构建服务消费者

第一步:创建一个新的 SpringBoot 应用,命名为 nacos-consumer

第二步:添加依赖,与上面的构建服务提供者的内容一样

第三步:创建启动类并提供一个应用接口,在该接口实现对服务提供者提供的接口进行调用

<code>

nacos

registry

,

nacos-provider

10

.32

.52

.236

:8080

register

finished

/<code>

这里使用了 Spring Cloud Common 中的 LoadBalancerClient 接口来挑选服务实例信息,使用负载均衡的算法,然后获取被选中实例的URI,拼接上服务提供者接口的请求地址及参数,使用 RestTemplate 进行调用。

第四步:配置服务名称及 Nacos 地址

跟上面的配置服务提供者基本一致,只是服务名及端口根据需要进行修改

<code>

server:

port:

8082

spring:

application:

name:

nacos-consumer

cloud:

nacos:

discovery:

server-addr:

127.0

.0

.1

:8848

/<code>

第五步:启动服务

访问地址
http://localhost:8082/test,查看日志输出

<code>

Invoke

:

http

:

Invoke

:

http

:

Invoke

:

http

:

Invoke

:

http

:/<code>

可以看到,多次请求会被依次分配给 nacos-provider 服务集群中的两个实例,可以分别查看两个实例的日志输出进行验证。

多种方式实现服务间调用

使用RestTemplate

第一步:注册

<code>

@Bean

@LoadBalanced

public RestTemplate restTemplate() {

return

new

RestTemplate

(); }/<code>

@LoadBalanced 注解标记负载均衡

第二步:使用

<code> 

static

class

TestController

{ RestTemplate restTemplate; (

"/test"

)

public

String

test

()

{ String result = restTemplate.getForObject(

"http://nacos-provider/hello?name=nacos"

, String

.

class

)

;

return

"Return : "

+ result; } }/<code>

请求地址中,直接使用服务名代替 Host 部分,在真正调用时,SpringCloud 会将请求拦截,然后通过负载均衡器选出节点,并替换为具体节点的IP与端口执行调用。

使用Feign

第一步:消费者服务添加对 feign 的依赖

<code>

<

dependency

>

<

groupId

>

org.springframework.cloud

groupId

>

<

artifactId

>

spring-cloud-starter-openfeign

artifactId

>

dependency

>

/<code>

第二步:修改服务启动类,开启 Feign 客户端功能,并定义客户端

<code>

@EnableDiscoveryClient

@SpringBootApplication

@EnableFeignClients

public class Application {

public

static

void

main

(String[] args) {

SpringApplication

.run

(Application.class, args); } @

FeignClient

(

"nacos-provider"

)

public

static

interface

Client

{

@GetMapping

(

"/hello"

) String hello(

@RequestParam

String name); } }/<code>
  • @EnableFeignClients 注解用于开启扫描 Feign 客户端的功能
  • @FeignClient 注解用于定义 Feign 客户端,需要指定这个接口所要调用的服务名称,接口中定义的方法使用 Spring MVC 的注解就可以来绑定服务提供方的 REST 接口。

注意:如果是 get 请求方式,@RequestParam 必须要带,否则 get 请求会被转换成 post 请求导致请求失效

第三步:通过 Spring 容器注入接口对象,直接调用

<code> 

public

class

FeignConsumerController

{

private

Application.Client client;

public

String test() { String result = client.hello(

"haha"

);

return

"result : "

+ result; } }/<code>

优点:强类型检查

第三章:基于Nacos构建分布式配置中心

分布式配置中心概念

Nacos配置读取及动态刷新

接下来通过一个简单的例子实现在 Nacos 中创建配置,在 SpringBoot 应用中加载 Nacos 配置并响应 Nacos 中的配置变化

创建配置

第一步:进入 Nacos 管理界面,选择 配置管理 \> 配置列表,点击右侧 + 号创建新配置


重要的配置项说明:

  • DataId:使用 {项目名}.{配置格式} 的格式,本次填入 nacos-config-client.properties
  • Group:分组名,默认为 DEFAULT_GROUP,本次操作使用默认值
  • 配置格式:默认为 properties,本次操作使用默认值,如果要使用其它格式则需要在应用中进行相应地配置
  • 配置内容填写为 course.title=nacos
创建应用

第一步:创建一个 SpringBoot 应用,命名为 nacos-config-client,保持跟上面的 DataId 一致第二步:添加依赖

添加父依赖

<code>

nacos

registry

,

nacos-provider

10

.32

.52

.236

:8080

register

finished

/<code>

添加依赖管理器

<code>

server:

port:

8082

spring:

application:

name:

nacos-consumer

cloud:

nacos:

discovery:

server-addr:

127.0

.0

.1

:8848

/<code>

添加依赖

<code>

<

dependencies

>

<

dependency

>

<

groupId

>

org.springframework.boot

groupId

>

<

artifactId

>

spring-boot-starter-web

artifactId

>

dependency

>

<

dependency

>

<

groupId

>

org.springframework.cloud

groupId

>

<

artifactId

>

spring-cloud-starter-alibaba-nacos-config

artifactId

>

dependency

>

<

dependency

>

<

groupId

>

org.projectlombok

groupId

>

<

artifactId

>

lombok

artifactId

>

<

optional

>

true

optional

>

dependency

>

dependencies

>

/<code>

示例中并没有添加对 Nacos 服务注册发现模块的依赖,配置功能跟服务注册发现功能是完全分离的,可以独立使用。

第三步:配置

配置服务名称及 Nacos 地址

<code>

Invoke

:

http

:

Invoke

:

http

:

Invoke

:

http

:

Invoke

:

http

:/<code>

spring.application.name 配置成与 Nacos 中创建的 DataId 一致

第四步:创建启动类,并提供一个对外接口

<code> 

public

class

Application

{

public

static

void

main

(String[] args)

{ SpringApplication.run(Application

.

class

,

args

)

; } 4j

static

class

TestController

{ (

"${course.title}"

)

private

String title; (

"/test"

)

public

String

hello

()

{

return

title; } } }/<code>

接口实现很简单,就是输出配置文件中的 couse.title 的内容

  • @Value 注解用于读取配置文件中的配置
  • @RefreshScope 注解用于支持动态刷新配置内容,有了这个注解,在 Nacos 修改配置内容,@Value 就会及时读取到最新的内容

第五步:启动应用在启动日志最开始可以看到两行日志,说明已经成功从 Nacos 中加载配置,而且是在应用启动之前进行加载

<code>Loading nacos data, dataId: 

'nacos-config-client.properties'

, group:

'DEFAULT_GROUP'

Located property

source

: CompositePropertySource {name=

'NACOS'

, propertySource/<code>

第六步:验证配置获取

访问接口
http://localhost:8083/test,如果一切正常,则会输出 Nacos 中配置的 nacos

第七步:验证配置动态更新

在 Nacos 管理后台修改配置内容为 course.title=nacos changed,再次访问接口,可以看到输出的结果也会相应改变。

查看日志,可以看到配置被重新加载

<code>Loading nacos data, dataId: 

'nacos-config-client.properties'

, group:

'DEFAULT_GROUP'

Located property

source

: CompositePropertySource {name=

'NACOS'

, propertySources=[NacosPropertySource {name=

'nacos-config-client.properties'

}]} ... Refresh keys changed: [course.title]/<code>

Nacos配置多环境管理

在软件开发流程中,最基本需要经历 开发 > 测试 > 生产 等几个步骤,其中测试还可以折分 sit测试、uat测试、压力测试等,每个步骤都可能会存在相同的配置项,但是需要配置不同的配置值。以数据库为例,开发数据库供开发人员使用及自测,测试数据库供测试人员使用,生产数据库供线上使用。对于程序来说,只需要对数据源进行操作,而数据源具体连接哪个数据库,则完全由配置值进行限定。所谓多环境管理,就是为每个环境准备一套配置文件,在相应环境部署应用时,读取相应的配置文件即可,这些对于程序而言是透明的。

Nacos配置加载规则

涉及配置项:

  • spring.cloud.nacos.config.prefix:配置文件前缀,如果没有配置,则默认使用 spring.application.name 值
  • spring.cloud.nacos.config.file-extension:配置文件后缀,默认为 properties
  • spring.cloud.nacos.config.group:配置文件分组,默认为 DEFAULT_GROUP
  • spring.profiles.active:配置当前 profile

Nacos 采用 Group + DataId 进行配置文件定位,其中 DataId 的完整的规则是

1

2

${spring.cloud.nacos.config.prefix}-${spring.profile.active}.${spring.cloud.nacos.config

.file-extension}

  

使用 Profile 实现多环境管理

分别设置 spring.profile.active 为 dev 与 test,实现应用自动加载 Nacos 中不同的配置文件。

第一步:在 Nacos 管理后台创建两个配置文件

两个文件的 DataId 分别为
nacos-config-profile-dev.yaml 与
nacos-config-profile-test.yaml,Group 都为 NACOS_PROFILE,配置格式都选择为 yaml,内容配置项都为 course.title,配置值分别为 nacos-dev 与 nacos-test,这样,应用加载到不同的文件时,输出的值就会不一样。

<code>/<code>


第二步:创建 SpringBoot 应用

名称为 nacos-config-profile,配置 spring.profiles.active 为 dev

如果不知道如何创建一个 Nacos 配置中心的客户端应用,请参考前面的章节

配置文件 bootstrap.yml 内容如下

<code>

server:

port:

8084

spring:

application:

name:

nacos-config-profile

cloud:

nacos:

config:

server-addr:

127.0

.0

.1

:8848

prefix:

${spring.application.name}

file-extension:

yaml

group:

NACOS_PROFILE

profiles:

active:

dev

/<code>

第三步:启动应用

查看启动日志,可以看到加载的日志文件

<code>Loading nacos data, dataId: 

'nacos-config-profile-dev.yaml'

,

group

:

'NACOS_PROFILE'

/<code>

第四步:修改 profile 为 test,重启应用

查看启动日志,可以看到加载的日志文件

1

Loading nacos data, dataId: 'nacos-config-profile-test.yaml', group: 'NACOS_PROFILE'

  

思考

从上面的示例看出,实现多环境管理非常简单,只需要配置当前应用的 profile,应用就会自动加载相应 profile 名称的配置文件。

  • 优点:与 SpringCloudConfig 配置一样,方便从 SpringCloudConfig 项目迁移过来
  • 缺点:Nacos 面向的整个微服务,而不是单个应用,如果微服务数量很多,配置列表将会出现不同应用,不同环境交织在一起,维护将会变得困难
  • 建议:服务数量少时使用
使用 namespace 实现多环境管理

为了让配置列表不那么太杂乱,最简单的办法就是把一个大的列表转换成 N 个小的列表,这样每一个列表就会显得整齐起来,这也是 namespace 的作用。

第一步:在 Nacos 管理后台创建 namespace

根据 dev 及 test 两个环境创建两个相应的 namespace

namespace 的 ID 可以设置,也可以自动生成,后面配置需要用到,本例 ID 使用与名称一样的值


回到配置列表界面,可以看到左上角除了一直存在的 public 之外,出现了刚刚定义了 dev 及 test 两个标签页

其中 public 标签中可以看到之前创建的配置文件,而 dev 及 test 标签下则没有配置文件

第二步:在 dev 及 test 标签下分别创建配置文件

两个文件的 DataId 都为 nacos-config-profile.yaml,Group 都为 NACOS_PROFILE,配置格式都选择为 yaml,内容配置项都为 course.title,配置值分别为 nacos-namespace-dev 与 nacos-namespace-test,

第三步:在应用配置文件中添加
spring.cloud.nacos.config.namespace 配置项,内容填写 namespace 的 ID

示例:

<code>

server:

port:

8084

spring:

application:

name:

nacos-config-profile

cloud:

nacos:

config:

server-addr:

127.0

.0

.1

:8848

prefix:

${spring.application.name}

file-extension:

yaml

group:

NACOS_PROFILE

namespace:

test

profiles:

active:

test

/<code>

第四步:启动应用

查看启动日志,可以看到加载的日志文件

<code>Loading nacos data, dataId: 

'nacos-config-profile.yaml'

,

group

:

'NACOS_PROFILE'

/<code>

思考

通过 namespace 实现多环境配置简单易用,方便维护,也是官方推荐的方式。

不同的环境使用不同的 profile,如果通过修改配置文件的方式来修改 profile,需要在不同环境发布前先修改一次配置文件,在发布脚本的启动命令中使用 -Dspring.profiles.active=DEV 的方式来动态指定,会更加灵活。

Nacos配置持久化到数据库

在前面的课程中,我们已经学习了 Nacos 作为服务注册中心及配置中心,与 Spring Cloud 体系结合的基础使用方法,其中 Nacos 都是以单机模式运行,数据默认保存在本地的内嵌数据库中,用于学习这没有问题,但是生产环境中基于高可用原则则需要对 Nacos 进行集群部署,那么数据保存本地则会出现一致性问题。为了解决这个问题,Nacos 采用了集中式存储的方式来支持集群化部署,目前只支持 MySQL 存储。

实操

第一步:安装 Mysql 数据库,版本要求:5.6.5+

目前不支持 8.0 以上版本,可以通过修改源码解决

第二步:初始化数据库初始化脚本在 Nacos 程序包下的 conf 目录下的 nacos-mysql.sql 文件

第三步:配置 Nacos修改 Nacos 程序包下
conf/application.properties 文件,添加 MySQL 数据源配置

文件中有示例,只需要打开注释并修改即可

<code>

spring.datasource.platform

=mysql

db.num

=

1

db.url.0

=jdbc:mysql://

127.0

.

0.1

:

3316

/nacos?characterEncoding=utf8&connectTimeout=

1000

&socketTimeout=

3000

&autoReconnect=

true

db.user

=test

db.password

=

123456

/<code>

打完收工。重新访问
http://localhost:8848/nacos/,并根据之前学习的 基于Nacos构建分布式配置中心 中的步骤可以再重新操作一篇,同时可以登录数据库查看,验证数据是否成功入库。

Nacos集群部署

官方集群部署说明文档
https://nacos.io/zh-cn/docs/cluster-mode-quick-start.html

根据官方文档说明,Nacos的集群架构如下图所示


实操

因为是用于学习,我们没有多台服务器可以使用,所以本例将在单机上同时启动多个 Nacos 实例,每一个实例使用不同的端口。

启动三个 Nacos 实例构成集群,端口分别为 8848、8849、8850,然后使用 Nginx 对三台 Nacos 进行反向代理

第一步:安装 Mysql 数据库

第二步:初始化数据库初始化

脚本在 Nacos 程序包下的 conf 目录下的 nacos-mysql.sql 文件

第三步:配置 Nacos 数据源

修改 Nacos 程序包下
conf/application.properties 文件,添加 MySQL 数据源配置

文件中有示例,只需要打开注释并修改即可

<code>

@Bean

@LoadBalanced

public RestTemplate restTemplate() {

return

new

RestTemplate

(); }/<code>

第四步:配置集群

在 Nacos 程序包的 conf 目录下有一个 cluster.conf.example 文件,复制为 cluster.conf,内容为

第五步:启动实例

因为本例需要在单机上启动多个 Nacos 实例,只是端口不一样,所以启动实例时,需要设置端口。

<code> 

static

class

TestController

{ RestTemplate restTemplate; (

"/test"

)

public

String

test

()

{ String result = restTemplate.getForObject(

"http://nacos-provider/hello?name=nacos"

, String

.

class

)

;

return

"Return : "

+ result; } }/<code>

启动三个实例,这样 Nacos 集群已经配置完成,接下来使用 Nginx 进行反向代理。

第六步:配置 Nginx 反向代理

<code>

@EnableDiscoveryClient

@SpringBootApplication

@EnableFeignClients

public class Application {

public

static

void

main

(String[] args) {

SpringApplication

.run

(Application.class, args); } @

FeignClient

(

"nacos-provider"

)

public

static

interface

Client

{

@GetMapping

(

"/hello"

) String hello(

@RequestParam

String name); } }/<code>

这样就可以通过 localhost:8080/nacos 访问 Nacos 后台了。

<code>欢迎关注艾编程,回复关键词“alibaba”看系列专辑教程/<code>



分享到:


相關文章: