Spring Cloud

Spring Cloud概述

系统架构的演变

  • 单体架构:代码耦合、迭代困难、扩展受限
  • 分布式架构:各系统存在重叠业务(重复开发)
  • SOA:抽取的粒度大、服务提供方和消费方耦合度高
  • 微服务:单一职责、面向服务
    在这里插入图片描述

什么是Spring Cloud?

  • Spring Cloud是一套微服务开发的全家桶
  • Spring没有重复造轮子,只是基于Spring Boot将其他公司 (Netflix) 的服务框架组合起来

Spring Cloud Alibaba

  • Spring Cloud = Spring Boot + Netflix
  • Spring Cloud Alibaba = Spring Boot + Alibaba

Spring Cloud、Spring Cloud Alibaba、Spring Boot的版本关系

https://github.com/alibaba/spring-cloud-alibaba

Spring Cloud Alibaba VersionSpring Cloud VersionSpring Boot Version
2021.0.1.0Spring Cloud 2021.0.12.6.3
2.2.7.RELEASESpring Cloud Hoxton.SR122.3.12.RELEASE
2021.1Spring Cloud 2020.0.12.4.2
2.2.6.RELEASESpring Cloud Hoxton.SR92.3.2.RELEASE
2.1.4.RELEASESpring Cloud Greenwich.SR62.1.13.RELEASE
2.2.1.RELEASESpring Cloud Hoxton.SR32.2.5.RELEASE
2.2.0.RELEASESpring Cloud Hoxton.RELEASE2.2.X.RELEASE

Nacos

Na: Naming 、co: Configuration,s: Service

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

nacos的安装

将安装包上传到/usr/upload目录下

[root@localhost ~]# cd /usr/upload
[root@localhost upload]# tar -zxvf nacos-server-1.4.1.tar.gz -C /usr/local	

启动和关闭:

[root@localhost ~]# cd /usr/local/nacos/bin/
[root@localhost bin]# ./startup.sh -m standalone #非集群模式启动
[root@localhost bin]# ./shutdown.sh

测试:

http://192.168.23.135:8848/nacos,默认用户名&密码为: nacos

Nacos注册中心(存放服务)

  • Nacos-Server:提供服务的注册和发现
  • Nacos-Provider:把自身的服务实例注册到Nacos Server中
  • Nacos-Consumer:通过Nacos Server获取服务列表,消费服务

使用Nacos注册中心

nacos_provider模块相关配置

pom.xml

<!--nacos客户端-->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

application.yml

spring:
  cloud:
    nacos:
      discovery:
        server-addr: 192.168.22.135:8848 #nacos服务的地址
  application:
    name: nacos-provider #向注册中心注册的服务名

启动类

@SpringBootApplication
@EnableDiscoveryClient//向注册中心注册该服务,并可以获取其他服务的调用地址
public class ProviderApp {
    public static void main(String[] args) {
        SpringApplication.run(ProviderApp.class);
    }
}

controller

@RestController
@RequestMapping("/provider")
public class ProviderController {

    @Autowired
    private UserService userService;

    @RequestMapping("/getUserById/{id}")
    public User getUserById(@PathVariable Integer id){
        return userService.getUserById(id);
    }
}
nacos_consumer模块相关配置

pom.xml

<!--nacos客户端-->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

application.yml

spring:
  cloud:
    nacos:
      discovery:
        server-addr: 192.168.209.129:8848 #nacos服务的地址
  application:
    name: nacos-consumer #向注册中心注册的名字

启动类

@SpringBootApplication
@EnableDiscoveryClient//向注册中心注册该服务,并可以获取其他服务的调用地址
public class ConsumerApp {
    public static void main(String[] args) {
        SpringApplication.run(ConsumerApp.class);
    }
}

config

@Configuration
public class ConfigBean {
	@Bean
	public RestTemplate restTemplate(){
		return new RestTemplate();
	}
}

Controller

@RestController
@RequestMapping("/consumer")
public class ConsumerController {

    //访问Rest服务的客户端
    @Autowired
    private RestTemplate restTemplate;

    @Autowired
    private DiscoveryClient discoveryClient;

    /**
     * 根据id获取用户
     * @param id
     * @return
     */
    @RequestMapping("/getUserById/{id}")
    public User getUserById(@PathVariable Integer id){

        //获取nacos中注册的所有服务信息
        List<String> services = discoveryClient.getServices();
        for (String service : services) {
            System.out.println(service);
        }

        //获取nacos中注册的指定的服务信息
        ServiceInstance serviceInstance = discoveryClient.getInstances("nacos-provider").get(0);

        // String url = serviceInstance.getHost() + ":" + serviceInstance.getPort(); //192.168.182.1:9090
        // String url = "http://" + host + ":" + port + "/provider/getUserById/" + id;

        URI uri = serviceInstance.getUri();//http://192.168.182.1:9090
        String url = uri + "/provider/getUserById/" + id;

        //调用服务
        return restTemplate.getForObject(url, User.class);
    }

}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ofqHkHqh-1660563668067)(image/image-20220813195029601.png)]

Nacos配置中心(存放配置文件)

配置中心概述
  • 首先把项目中各种配置全部都放到一个集中的地方进行统一管理。

  • 当各个服务需要获取配置的时候,就来配置中心的接口拉取自己的配置。

  • 当配置中心中的各种参数有更新的时候,也能通知到各个服务实时的过来同步最新的信息,使之动态更新。

案例

创建nacos_config模块

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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>springcloud_parent</artifactId>
        <groupId>com.peng</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>nacos_config</artifactId>

    <dependencies>
        <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-config</artifactId>
        </dependency>
    </dependencies>
</project>

bootstrap.yml

  • 客户端配置文件的名称必须为bootstrap.yml

  • bootstrap/ application 的应用场景:

    • bootstrap.ymlapplicaton.yml 优先加载,应用于系统级别参数配置,一般不会变动;
    • application.yml应用于SpringBoot项目的自动化配置;
spring:
  cloud:
    nacos:
      config:
        server-addr: 192.168.23.135:8848
        file-extension: yaml #后缀名,只支持 properties 和 yaml 类型
        prefix: nacos-config #文件名,如果没有配置则默认为 ${spring.appliction.name}

启动类

@SpringBootApplication
@EnableDiscoveryClient //向注册中心注册该服务,并可以获取其他服务的调用地址
public class NacosConfigApp {
    public static void main(String[] args) {
        SpringApplication.run(NacosConfigApp.class,args);
    }
}

controller

@RestController
@RefreshScope //重新从BeanFactory获取一个新的实例(该实例使用新的配置)
public class ConfigController {

    //从配置文件中读取配置
    @Value("${spring.datasource.driver-class-name}")
    private String driverClassName;
    @Value("${spring.datasource.url}")
    private String url;
    @Value("${spring.datasource.username}")
    private String username;
    @Value("${spring.datasource.password}")
    private String password;
    @Value("${spring.datasource.type}")
    private String type;

    /**
     * 获取配置信息
     * @return
     */
    @RequestMapping("/config/info")
    public String getConfigInfo(){
        System.out.println(this);
        return driverClassName + "<br>" + url + "<br>" + username + "<br>" + password + "<br>" + type;
    }
}
向Nacos添加配置信息
  • 在 Nacos 中,dataId(配置文件的命名的规则) 的完整格式如下:

    s p r i n g . c l o u d . n a c o s . c o n f i g . p r e f i x . {spring.cloud.nacos.config.prefix}. spring.cloud.nacos.config.prefix.{spring.cloud.nacos.config.file-extension}

    • spring.cloud.nacos.config.prefix:默认是当前服务的服务名称
    • spring.cloud.nacos.config.file-extension:配置文件的格式(后缀),目前只支持yaml和properties

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zMrMbxJl-1660563668069)(image/image-20220813201101835.png)]

创建配置文件

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2MC87991-1660563668074)(image/image-20220813201221273.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-py6viJH1-1660563668075)(image/image-20220813201249377.png)]

测试

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ngn5gc7p-1660563668078)(image/image-20220813201419276.png)]

配置隔离

Nacos配置管理模型

  • 对于Nacos配置管理,通过Namespace、group、Data ID能够定位到一个配置集。

  • Namespace: 代表不同的环境的配置隔离, 如: 开发(dev)、测试(test), 生产(prod)等

  • Group: 可以代表某个项目, 如XX医疗项目, XX电商项目

  • DataId: 每个项目下往往有若干个工程, 每个配置集(DataId)是一个工程的主配置文件

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9cgNnGHn-1660563668079)(image/image-20220322154802460.png)]

  • 获取配置集需要指定:

    • nacos服务地址,必须指定

    • namespace,如不指定默认public

    • group,如不指定默认 DEFAULT_GROUP

    • dataId,必须指定

namespace隔离

命名空间(Namespace)是用于隔离多个环境的(如开发、测试、生产),而每个应用在不同环境的同一个配置(如数据库数据源)的值是不一样的。因此,我们应针对企业项目实际研发流程、环境进行规划。如某软件公司拥有开发、测试、生产三套环境,那么我们应该针对这三个环境分别建立三个namespace。

新建namespace

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Qda6BzIY-1660563668080)(image/image-20220813201831935.png)]

在配置管理与服务管理模块下, 可在导航栏切换不同的namespace

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rZxZztVz-1660563668083)(image/image-20220813201948991.png)]

克隆配置文件: 可用于将配置迁移到其他namespace

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rBVIRgVw-1660563668084)(image/image-20220813202254819.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5oxOwjKl-1660563668087)(image/image-20220813202307848.png)]

此时在config模块中读取nacos中的配置文件可以指定namespace

spring:
  cloud:
    nacos:
      config:
        server-addr: 192.168.23.135:8848
        file-extension: yaml
        prefix: nacos-config
        namespace: a66ca122-fb24-46ba-bde0-58508c2d6689 #开发环境dev

Group隔离

新建配置文件并修改Group名

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1Tb78Gzs-1660563668089)(image/image-20220813202821600.png)]

不同的Group下可以有相同名称的配置

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8wZO9r7C-1660563668090)(image/image-20220813202843231.png)]

此时在config模块中读取nacos中的配置文件可以指定namespace和group

spring:
  cloud:
    nacos:
      config:
        server-addr: 192.168.204.129:8848
        file-extension: yaml
        prefix: nacos-config
        namespace: a66ca122-fb24-46ba-bde0-58508c2d6689 #开发环境dev
        group: NACOS_GROUP #nacos项目

服务隔离

consumer调用provider

namespace不同、group不同:调用失败

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SdcTQkyd-1660563668091)(image/image-20220813163955036-16603941187291.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TfDVSsUD-1660563668093)(image/image-20220813163804926-16603941187292.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AOmEtBhA-1660563668094)(image/image-20220813163910273-16603941187293.png)]

测试结果

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6R1ejThh-1660563668095)(image/image-20220813164404124-16603941187294.png)]

修改consumer配置文件的namespace和group

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-P8mkmwwH-1660563668096)(image/image-20220813164517805-16603941187307.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ydYTMvSS-1660563668100)(image/image-20220813164543230-16603941187296.png)]

测试结果

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tl6cKQ8S-1660563668101)(image/image-20220813164423900-16603941187308.png)]

Nacos持久化

Nacos默认有自带嵌入式数据库derby,但是如果做集群模式的话,就不能使用自己的数据库,不然每个节点一个数据库,数据就不统一了,需要使用外部的mysql

切换Nacos使用的数据库

修改/usr/local/nacos/conf/application.properties文件

关闭注释, 切换为mysql数据库(目前只支持mysql,版本要求:5.6.5+)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ddIrhUGw-1660563668103)(image/image-20220813203925272.png)]

初始化数据库

创建nacos数据库并导入sql到mysql中

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-T4xfttbr-1660563668104)(image/image-20201218153401929.png)]

测试

重启nacos

因为更换了数据源,在nacos网站中重新创建配置文件:注意Data ID和Group

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OU8JnLgC-1660563668105)(image/image-20220813172058395-16603945783279.png)]

测试nacos所有写到嵌入式数据库的数据是否都写到了mysql

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值