SpringCloud学习4(Spring Cloud Alibaba)概念简介环境搭建注册中心Nacos

Posted Huathy-雨落江南,浮生若梦

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SpringCloud学习4(Spring Cloud Alibaba)概念简介环境搭建注册中心Nacos相关的知识,希望对你有一定的参考价值。

文章目录

微服务概念与演进

微服务概念与术语

服务器、服务(应用)、微服务(模块)、节点(服务或者服务器)
垂直扩展(增强硬件性能)、水平扩展(增加服务器或者程序实例来分散负载)
容错率(允许服务集群错误出现的范围与概率)、宕机(服务挂了)
高内聚低耦合(内聚:程序功能独立,耦合:程序交互)
流量(访问量)、服务依赖(项目、程序间的相互调用)
**单体架构:**一个系统业务量很小,所有代码放在一个项目,所有应用服务在同一机器(应用、mysql、redis)。(开发部署简单,但存在单点故障问题)
**分布式:**拆分服务(应用、MySQL、reids)独立部署。
**集群:**解决单点故障,多部署几个通过负载均衡设施(nginx、MyCat、Eureka等)来分散请求。

系统架构演进

单体应用架构 --> 垂直应用架构 --> 分布式架构 --> SOA架构 --> 微服务架构 -> 云原生 --> 。。。

单体应用架构

优点:架构简单,部署维护方便,运维成本低
缺点:不易于开发维护,模块耦合单点容错率低,无法针对模块进行性能优化和水平扩展

垂直应用架构

优点:系统拆分实现流量分担,解决并发问题。可以针对不同模块进行优化和水平扩展。一个系统不会影响其他系统,提高容错率。
缺点:系统相互独立,无法相互调用。存在重复开发的任务。

分布式架构

优点:抽取公共的功能为服务层,提高代码复用性。
缺点:系统耦合度变高,调用关系复杂,难以维护。

SOA架构(SOA:面向服务)

优点:使用注册中心解决了服务之间的服务之间调用关系的自动调节。
缺点:服务之间相互依赖,一旦某个环节出错,可能导致服务雪崩。服务关系复杂,运维测试部署成本高。

微服务架构

在某种程度上来说,微服务架构是SOA架构的进一步演进,强调服务的彻底拆分。
优点:服务原子化拆分,独立打包部署升级,保证每个微服务清洗的任务划分,利于扩展。微服务之间采用rest/rpc轻量级http协议相互调用。不受语言、人员限制。
缺点:分布式系统开发技术成本高(容器、分布式事务等)

微服务架构介绍

SpringCloud简介

一些列框架的集合。利用SpringBoot简化了分布式系统基础设施的开发。eg:服务注册发现、配置中心、消息总线、负载均衡、断路器、链路监控、数据监控。

SpringBoot和SpringCloud有啥关系?

SpringBoot专注于快速方便的开发单个单体应用服务
SpringCloud关注全局的微服务协调治理,将SpringBoot开发的一个个单体微服务整合并管理起来,为各个微服务之间提供:配置管理、服务注册发现、断路器、路由、事件总线、分布式事务等集成服务。

微服务环境搭建

本文以电商商品、订单模块为例子。
商品服务(提供列表查询、ID查询接口),订单服务(提供创建订单接口)。
服务调用:在微服务架构中最常见的场景是服务之间的相互调用。一般将调用方成为消费者,被调用方成为生产者(提供者)。
模块设计:

  • cloud2-parent
    • cloud2-product-api
    • cloud2-product-server
    • cloud2-order-api
    • cloud2-order-server

创建Maven父工程cloud2_parent并导入依赖

<?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>
    <packaging>pom</packaging>
    <modules>
        <module>cloud2-product-api</module>
        <module>cloud2-product-server</module>
        <module>cloud2-order-api</module>
        <module>cloud2-order-server</module>
    </modules>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.3.4.RELEASE</version>
        <relativePath/>
    </parent>
    <groupId>com.hx</groupId>
    <artifactId>cloud2_parent</artifactId>
    <version>1.0</version>
    <name>cloud2_parent</name>
    <properties>
        <java.version>1.8</java.version>
        <spring-cloud.version>Hoxton.SR12</spring-cloud.version>
        <spring-cloud-alibaba.version>2.2.3.RELEASE</spring-cloud-alibaba.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>$spring-cloud.version</version>
            <!--  加上下面俩行,防止错误:Cannot resolve org.springframework.cloud:spring-cloud-dependencies:Hoxton.SR8  -->
            <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>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
    </dependencies>
</project>

创建product服务

创建cloud2-product-api项目,并导入依赖

<?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">
    <modelVersion>4.0.0</modelVersion>

    <parent>
        <artifactId>cloud2_parent</artifactId>
        <groupId>com.hx</groupId>
        <version>1.0</version>
        <relativePath/>
    </parent>

    <groupId>com.hx</groupId>
    <artifactId>cloud2-product-api</artifactId>
    <version>1.0</version>
    <name>cloud2-product-api</name>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>1.7</maven.compiler.source>
        <maven.compiler.target>1.7</maven.compiler.target>
    </properties>
</project>

编写实体类Product

@Data
@Accessors(chain = true)
// 微服务必须实现序列化接口
public class Product implements Serializable 
    private String id;
    private String name = "product";
    private String createTime;
    private String app = "product";

创建cloud2-product-server项目,并引入依赖

<?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>cloud2_parent</artifactId>
        <groupId>com.hx</groupId>
        <version>1.0</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>
    <artifactId>cloud-product-server</artifactId>
    <name>cloud-product-server</name>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>1.7</maven.compiler.source>
        <maven.compiler.target>1.7</maven.compiler.target>
    </properties>

    <dependencies>
        <dependency>
            <groupId>com.hx</groupId>
            <artifactId>cloud2-product-api</artifactId>
            <version>1.0</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>2.0.10</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    </dependencies>
</project>

编写配置文件

server:
  port: 8881
spring:
  application:
    name: cloud2-product-server

编写服务层和控制层代码(这里展示核心代码)

@Service
public class ProductServiceImpl implements ProductService 
    @Override
    public Product getById(String pid) 
        return new Product().setId(pid)
                .setCreateTime(SimpleDateFormat.getDateTimeInstance().format(new Date()));
    

    @Override
    public List<Product> list() throws InterruptedException 
        List<Product> result = new ArrayList<>();
        for (int i = 0; i < 15; i++) 
            Thread.sleep(100);
            result.add(new Product().setId(UUID.randomUUID().toString())
                    .setCreateTime(SimpleDateFormat.getDateTimeInstance().format(new Date())));
        
        return result;
    

@RestController
@RequestMapping("prd")
public class ProductController 
    @Autowired
    private ProductService productService;

    @RequestMapping("/pid")
    public Product getById(@PathVariable("pid") String pid) 
        return productService.getById(pid);
    

    @RequestMapping("/list")
    public List<Product> list() throws InterruptedException 
        return productService.list();
    

创建Order服务

创建cloud2-order-api,并导入依赖

<?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>cloud2_parent</artifactId>
        <groupId>com.hx</groupId>
        <version>1.0</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>
    <artifactId>cloud2-order-api</artifactId>
    <name>cloud2-order-api</name>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>1.7</maven.compiler.source>
        <maven.compiler.target>1.7</maven.compiler.target>
    </properties>
</project>

创建实体类Order

@Data
@Accessors(chain = true)
public class Order implements Serializable 
    private String id;
    private String name = "order";
    private String createTime;
    private String app = "order";

    private String pid;
    private String num;
    private Object product;

创建cloud2-order-server项目,并导入依赖

<?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>cloud2_parent</artifactId>
        <groupId>com.hx</groupId>
        <version>1.0</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>cloud2-order-server</artifactId>

    <name>cloud2-order-server</name>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>1.7</maven.compiler.source>
        <maven.compiler.target>1.7</maven.compiler.target>
    </properties>

    <dependencies>
        <dependency>
            <groupId>com.hx</groupId>
            <artifactId>cloud2-order-api</artifactId>
            <version>1.0</version>
        </dependency>
        <dependency>
            <groupId>com.hx</groupId>
            <artifactId>cloud2-product-api</artifactId>
            <version>1.0</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    </dependencies>
</project>

编写配置文件

server:
  port: 8882
spring:
  application:
    name: cloud2-order-server

编写service和controller代码(这里只展示核心代码)

@Service
public class 

SpringCloud学习资料

CSDN博客:http://blog.csdn.net/k21325/article/details/52789829

SpringCloud中文网:https://springcloud.cc/spring-cloud-netflix-zhcn.html

SpringCloud官网:http://projects.spring.io/spring-cloud/#quick-start

以上是关于SpringCloud学习4(Spring Cloud Alibaba)概念简介环境搭建注册中心Nacos的主要内容,如果未能解决你的问题,请参考以下文章

spring-cloud-kubernetes官方demo运行实战

第一篇:服务的注册与发现Eureka(Finchley版本)

spring-cloud-alibaba-sentinel和feign配合使用,启动报Caused by: java.lang.AbstractMethodError: com.alibaba.clo

#yyds干货盘点#spring-cloud-kubernetes官方demo运行实战

Spring Cloud Learning: 服务注册

想了解 spring-cloud-kubernetes,那就先来实战一把官方demo