微服务架构 基础(八)

微服务架构 基础(八)

持续更新…

简单小结

到此为止,我们大致学习完了一遍Spring Cloud全家桶,总的技能点如下图示… 🌟🌟🌟🌟

在这里插入图片描述

但是为何又要选择Spring Cloud Alibaba?
由于上图Spring Cloud Netflix许多组件已经不再维护了,因此我们需要替代方案,而Spring Cloud Alibaba就是一个较为完美的解决方案…
在这里插入图片描述
技术迭代更新周期短,虽然感觉有点头秃的样子,吾生也有涯,而知也无涯…😑😑😣😣

Spring Cloud Alibaba简介

Spring Cloud Alibaba是依赖Spring Cloud 相关的标准实现的一套微服务的全家桶

Spring Cloud Alibaba整个大致架构图如下:

在这里插入图片描述

Spring Cloud Alibaba主要功能

  • 服务限流降级:默认支持 WebServlet、WebFlux、OpenFeign、RestTemplate、Spring Cloud Gateway、Zuul、Dubbo 和 RocketMQ 限流降级功能的接入,可以在运行时通过控制台实时修改限流降级规则,还支持查看限流降级 Metrics 监控。
  • 服务注册与发现:适配 Spring Cloud 服务注册与发现标准,默认集成了 Ribbon 的支持。
  • 分布式配置管理:支持分布式系统中的外部化配置,配置更改时自动刷新。
  • 消息驱动能力:基于 Spring Cloud Stream 为微服务应用构建消息驱动能力。
  • 分布式事务:使用 @GlobalTransactional 注解, 高效并且对业务零侵入地解决分布式事务问题。
  • 阿里云对象存储:阿里云提供的海量、安全、低成本、高可靠的云存储服务。支持在任何应用、任何时间、任何地点存储和访问任意类型的数据。
  • 分布式任务调度:提供秒级、精准、高可靠、高可用的定时(基于 Cron 表达式)任务调度服务。同时提供分布式的任务执行模型,如网格任务。网格任务支持海量子任务均匀分配到所有 Worker(schedulerx-client)上执行。
  • 阿里云短信服务:覆盖全球的短信服务,友好、高效、智能的互联化通讯能力,帮助企业迅速搭建客户触达通道。

Nacos服务注册和配置中心

什么是Nacos?
Nacos英文全称Dynamic Naming and Configuration Service,Na为Naming/NameServer即注册中心,Co为Configuration即注册中心,service是指该注册/配置中心都是以服务为核心。Nacos构建以"服务"为中心的现代应用架构的服务基础设施,致力于微服务的发现、管理和信息配置,能帮助开发者迅速实现动态服务发现、服务配置、服务元数据以及流量管理,从而更敏捷、更容易地构建、交付和管理微服务平台

通俗地说,Nacos = Eureka+Config+Bus(即Nacos等价于前面所学的Eureka/Config/Bus),并支持AP+CP

在这里插入图片描述

官网下载并安装Nacos

Windows最新稳定版下载地址

  1. 下载并解压,进入bin目录执行startup.cmd文件(此时默认是以集群方式打开,可能读者启动会报错,因此需要进入当前目录的cmd命令窗口,输入命令startup.cmd -m standalone以单机方式启动… )

  2. 启动之后输入网址http://192.168.56.1:8848/nacos/index.html,进入管理界面,默认的账号和密码都是nacos

在这里插入图片描述

Nacos服务注册中心

新建服务提供者子模块(nacos-servie-8001)

修改配置类:

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <!-- Nacos配置依赖 -->
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>
</dependencies>

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>${spring-cloud.version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
        <!-- AlibabaCloud依赖管理 -->
        <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>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-dependencies</artifactId>
            <version>${spring-boot.version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

添加application.yml文件:

server:
  port: 8001
spring:
  application:
    name: nacos-service-provider
  
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848 # 配置Nacos地址

management:
  endpoints:
    web:
      exposure:
        include: '*' # 暴露所有监控端点

新建主启动类:

package cn.wu;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

@SpringBootApplication
@EnableDiscoveryClient
public class NacosServiceApplication8001 {
    public static void main(String[] args) {
        SpringApplication.run(NacosServiceApplication8001.class,args);
    }
}

新建控制层:

package cn.wu.controller;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class ProviderController {
    @Value("${server.port}")
    private String port;

    @GetMapping("/provide")
    public String provide(){
        return "当前端口为: "+port+",你好,Nacos!";
    }
}

启动该模块,进入Nacos管理界面查看详细信息:

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

Nacos负载均衡演示

由以下依赖可以了解到,Nacos自带了Ribbon,可以使用负载均衡…

在这里插入图片描述

通过参照nacos-service-8001添加服务提供者子模块(nacos-service-8001),记得需要修改端口号

此时,在同一个微服务名称下有两个实例对象:

在这里插入图片描述

新建服务消费者子模块(nacos-main-80)

依赖以及主启动类同以上两个子模块…

添加application.yml文件:

server:
  port: 80
spring:
  application:
    name: nacos-consumer

  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848

# 自定义服务提供者地址属性
nacos-provider-addr: http://nacos-service-provider

添加配置类:

package cn.wu.config;

import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;

@Configuration
public class ApplicationConfig {
    @Bean("restTemplateBean")
    @LoadBalanced // 负载均衡注解
    public RestTemplate getRestTemplate(){
        return new RestTemplate();
    }
}

添加控制层类:

package cn.wu.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

@RestController
public class ConsumerController {
    // 配置与代码做到分离
    @Value("${nacos-provider-addr}")
    private String serverURL ;
    private RestTemplate restTemplate;

    @Autowired
    @Qualifier("restTemplateBean")
    public void setRestTemplate(RestTemplate restTemplate) {
        this.restTemplate = restTemplate;
    }

    @GetMapping("/test")
    public String tet(){
        return restTemplate.getForObject(serverURL+"/provider",String.class);
    }
}

首先启动两个服务提供者,然后再启动服务消费者

实现了默认的轮询负载均衡效果:

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

负载均衡权重策略

服务消费者application.yml文件添加如下配置信息:

# 用于实现服提供者的负载均衡
user-service: # 微服务的名称
  ribbon:
    NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule

可视化界面中配置权重:

在这里插入图片描述
访问效果为多次命中权重较高的服务提供者端口…

实例对象状态

设置为非临时实例

临时实例采用心跳模式,非临时实例采用非主动检测模式,临时实例心跳不正常会被剔除,非临时实例则不会被剔除

spring:
  cloud:
    nacos:
      discovery:
        ephemeral: false # 设置为非临时实例

Nacos服务配置中心

在 Nacos Spring Cloud 中,dataId 的完整格式如下:
${prefix}-${spring.profiles.active}.${file-extension}

  1. prefix 默认为 spring.application.name 的值,也可以通过配置项spring.cloud.nacos.config.prefix来配置。
  2. spring.profiles.active 即为当前环境对应的 profile,当 spring.profiles.active 为空时,对应的连接符 - 也将不存在,dataId 的拼接格式将编程${prefix}.${file-extension}。
  3. file-exetension 为配置内容的数据格式,可以通过配置项 spring.cloud.nacos.config.file-extension 来配置。目前只支持 properties 和 yaml 类型。

新建服务配置中心子模块(nacos-config-center-10002)

引入主要依赖:

<!--配置中心依赖 -->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<!-- 服务注册中心依赖 -->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

主启动类不要忘记带@EnableDiscoveryClient注解了…
在这里插入图片描述

添加一个application.yml文件和一个bootstrap.yml文件,内容分别为:

spring:
  profiles:
    active: dev # 开发环境
server:
  port: 10002
spring:
  application:
    name: nacos-config-center
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848 # Nacos作为注册中心
      config:
        server-addr: localhost:8848 # Nacos作为配置中心
        file-extension: yaml # 指定为yml格式配置文件
# 此时的dataId应该为nacos-config-center-dev.yaml完整拼写规则

添加控制层:

package cn.wu.controlle;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RefreshScope // 热更新注解
@RestController
public class ConfigController {
    @Value("${config.info}")
    private String configInfo;

    @GetMapping("/config/info")
    public String getConfigInfo(){
        return "当前的还配置信息为: "+configInfo;
    }
}

按照以上的写法,dataID的完整拼写就是:nacos-config-center-dev.yaml格式

然后我们通过Nacos管理界面添加配置文件
在这里插入图片描述
新建配置文件中,输入Data Id以及填写文件内容
在这里插入图片描述

这里读者可能要小心文件名称和yaml文件内容的缩进问题…

访问结果为:

在这里插入图片描述

此时,再次修改Nacos管理界面中的yaml文件内容,重新输入URL,可以发现动态刷新的效果:

在这里插入图片描述

多环境配置共享
建立${spring.application.name}.yaml文件即可
多种配置的优先级
服务名称-profile.yaml > 服务名称.yaml > 本地配置

Nacos图形化管理界面

默认情况下,Namespace=public,Group=DEFAULT_GROUP,默认Cluster为DEFAULT,三者的范围大小大致如下:

在这里插入图片描述

  1. Nacos默认的命名空间是public,Namespace主要是用来作为隔离。比如对于不同的环境:开发、测试、生产环境,就可以创建三个不同的Namespace,对于不同的Namespace是相互隔离的。
  2. Group默认是DEFAULT_GROUP,Group可以把不同的微服务划分到同一个分组中去。
  3. Service就是微服务,一个Service可以包含多个Cluster(集群),Nacos默认Cluster是DEFAULT,Cluster是对指定微服务的一个虚拟划分,通过集群可以提高微服务的容灾性能。
  4. Instance就是微服务实例对象。

项目推荐用法为:一个微服务一个命名空间,各个微服务中使用分组来区分环境,比如开发,测试,生产

在这里插入图片描述

测试DateId方案,默认的的Namespace和Group下,通过Data Id划分不同环境

可视化管理界面中新建nacos-config-center-test.yaml文件,内容如下:

config:
  info: 测试环境,世界,你好!

然后修改application.yml文件内容为:

spring:
  profiles:
    active: test # 测试环境
#    active: dev # 开发环境

此时,重启后访问相应的URL,结果为:

在这里插入图片描述

测试Group方案,默认Namespace相同,DataId相同

分别在不同的group(INFO_GROUP_1和INFO_GROUP_2)新建两个nacos-config-center-info.yaml文件:
在这里插入图片描述
修改application.yml和bootstrap.yml文件内容:

spring:
  profiles:
    active: info
#    active: test # 测试环境
#    active: dev # 开发环境
...
server:
  port: 10002
spring:
  application:
    name: nacos-config-center
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848 # Nacos作为注册中心
      config:
        server-addr: localhost:8848 # Nacos作为配置中心
        file-extension: yaml # 指定为yml格式配置文件
        group: INFO_GROUP_1 # 指定分组为INFO_GROUP_1的分组

重新启动,浏览器中输入URL,测试:

在这里插入图片描述
修改bootstrap.yml文件内容的group为INFO_GROUP_2,重启,此时的结果为:

在这里插入图片描述

测试Namespace方案,默认Group,相同的DataId

新建两个命名空间(dev和test):

在这里插入图片描述

在dev的命名空间创建三个yaml文件(同理,在test中也创建三个yaml文件):

在这里插入图片描述

分别修改application.yml和bootstrap.yml文件内容为:

spring:
  profiles:
#    active: info
#    active: test # 测试环境
    active: dev # 开发环境
...
server:
  port: 10002
spring:
  application:
    name: nacos-config-center
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848 # Nacos作为注册中心
      config:
        server-addr: localhost:8848 # Nacos作为配置中心
        file-extension: yaml # 指定为yml格式配置文件
        group: DEFAULT_GROUP # 指定分组为DEAULT_GROUP的分组
        namespace: 5aaa10f2-9fdc-40c7-9617-6736a6bd5eba # 命名空间ID

在这里插入图片描述
其余相应测试读者自行尝试…

Nacos集群和持久化配置

默认Nacos使用嵌入式数据实现数据的存储。所以,如果启动多个默认配置下的Nacos节点,数据存储是存在一致性问题的。为了解决这个问题,Nacos采用了集中式存储的方式来支持集群持久化部署,目前只支持MySQL。

Nacos支持三种部署模式

  • 单机模式 - 用于测试和单机试用
  • 集群模式 - 用于生产模式,确保高可用
  • 多集群模式 - 用于多数据中心场景

首先进入Nacos解压目录寻找conf目录下找到nacos-mysql.sql文件,新建数据库全名为nacos_config的数据库,再使用MySQL执行该SQL脚本文件…

在这里插入图片描述

在这里插入图片描述

然后,在当前目录下修改application.properties文件,增加mysql数据源…

spring.datasource.platform=mysql
db.num=1
db.url.0=jdbc:mysql://192.168.50.248:3306/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
db.user=root
db.password=root

修改完毕后,保存重启Nacos

进入管理界面,添加一个配置文件,并查看数据库信息:

在这里插入图片描述
在这里插入图片描述

持久化完成…

总而言之,只要包含了bootstrap.yml文件,不管是数据源配置还是框架配置等,都可以通过nacos来实现动态配置…

Linux版Nacos与MySQL生产环境配置

环境搭建要求: 一个Nginx,三个注册中心Nacos节点以及一个MySQL

在这里插入图片描述

Ubuntu下载Nacos集群

下载相应Nacos的tar.zip包并解压,然后复制三份Nacos(分别命名为为nacos-1,nacos-2,nacos-3),然后进入nacos-1/conf目录下修改application.properties(有两处地方需要修改… )

在这里插入图片描述
MySQL创建nacos_config数据库,并执行nacos-mysql.sql脚本文件,然后修改启动Nacos内存大小限制,防止出现内存不足的情况

在这里插入图片描述

在当前目录复制一份cluster.conf,修改内容(这里要注意将主机名要填写ip地址… )

在这里插入图片描述
其余Nacos文件同样操作,分别修改port为4444和5555…

Docker实现Nacos集群(推荐…)

nacos1

docker run -d \
-e PREFER_HOST_MODE=hostname \
-e MODE=cluster \
-e NACOS_APPLICATION_PORT=3333 \
-e NACOS_SERVERS="192.168.50.248:3333 192.168.50.248:4444 192.168.50.248:5555" \
-e SPRING_DATASOURCE_PLATFORM=mysql \
-e MYSQL_SERVICE_HOST=192.168.50.248 \
-e MYSQL_SERVICE_PORT=3306 \
-e MYSQL_SERVICE_USER=root \
-e MYSQL_SERVICE_PASSWORD=root \
-e MYSQL_SERVICE_DB_NAME=nacos_config \
-e NACOS_SERVER_IP=192.168.50.248 \
-e JVM_XMS=512M \
-e JVM_XMX=512M \
-e JVM_XMN=256M \
-p 3333:3333 \
--name nacos1 \
nacos/nacos-server:1.3.0

nacos2

docker run -d \
-e PREFER_HOST_MODE=hostname \
-e MODE=cluster \
-e NACOS_APPLICATION_PORT=4444 \
-e NACOS_SERVERS="192.168.50.248:3333 192.168.50.248:4444 192.168.50.248:5555" \
-e SPRING_DATASOURCE_PLATFORM=mysql \
-e MYSQL_SERVICE_HOST=192.168.50.248 \
-e MYSQL_SERVICE_PORT=3306 \
-e MYSQL_SERVICE_USER=root \
-e MYSQL_SERVICE_PASSWORD=root \
-e MYSQL_SERVICE_DB_NAME=nacos_config \
-e NACOS_SERVER_IP=192.168.50.248 \
-e JVM_XMS=512M \
-e JVM_XMX=512M \
-e JVM_XMN=256M \
-p 4444:4444 \
--name nacos2 \
-d nacos/nacos-server:1.3.0

nacos3

docker run -d \
-e PREFER_HOST_MODE=hostname \
-e MODE=cluster \
-e NACOS_APPLICATION_PORT=5555 \
-e NACOS_SERVERS="192.168.50.248:3333 192.168.50.248:4444 192.168.50.248:5555" \
-e SPRING_DATASOURCE_PLATFORM=mysql \
-e MYSQL_SERVICE_HOST=192.168.50.248 \
-e MYSQL_SERVICE_PORT=3306 \
-e MYSQL_SERVICE_USER=root \
-e MYSQL_SERVICE_PASSWORD=root \
-e MYSQL_SERVICE_DB_NAME=nacos_config \
-e NACOS_SERVER_IP=192.168.50.248 \
-e JVM_XMS=512M \
-e JVM_XMX=512M \
-e JVM_XMN=256M \
-p 5555:5555 \
--name nacos3 \
nacos/nacos-server:1.3.0

如下:

在这里插入图片描述
在这里插入图片描述


Ubuntu中配置Nginx

在/etc/nginx/nginx.conf修改配置

在这里插入图片描述
重启Nginx后,访问http://localhost:1111/nacos/index.html,结果为:

在这里插入图片描述
以上实现了服务器端的负载均衡…

Nacos管理界面添加配置文件(nacos-config-center-dev.yaml),然后回到IDEA,修改服务配置中心子模块(nacos-config-center-10002)的配置文件

spring:
  profiles:
#    active: info
#    active: test # 测试环境
    active: dev # 开发环境
####################################################################
server:
  port: 10002
spring:
  application:
    name: nacos-config-center
  cloud:
    nacos:
      discovery:
        server-addr: 192.168.50.248:1111 # Nacos作为注册中心,由于利用到了负载均衡,所以这里填写Nginx监听端口
      config:
        server-addr: 192.168.50.248:1111 # Nacos作为配置中心,由于利用到了负载均衡,所以这里填写Nginx监听端口
        file-extension: yaml # 指定为yml格式配置文件
#        group: INFO_GROUP_1 # 指定分组为INFO_GROUP的分组
#        namespace: 5aaa10f2-9fdc-40c7-9617-6736a6bd5eba # 命名空间ID

测试结果为:在这里插入图片描述


内容扩充

Ubuntu中JDK安装

  • 首先下载tar包,通过tar -zxvf命令解压
  • 移动,sudo mv jdk /usr/local/jdk8
  • 环境配置,cd /root , sudo vim .bashrc

在这里插入图片描述



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值