SpringBootCloud微服务入门

微服务诞生的背景

普通写的程序大而全,但是一旦其中一项出现问题,整个服务将会瘫痪。微服务架构就是将一个大系统拆分成若干个小系统,其中一个服务瘫痪后,其他业务照样可以运行。

例子:一个大型火车站可以通往各地,当火车站出现断网等意外时,整个火车站就将瘫痪。微服务就是建造多个火车站分别负责东西南北各个位置,一个方向瘫痪时,其他火车站依旧可以完成客运任务。

微服务架构解决方案

大厂使用自研的微服务框架,防止使用开源的框架,框架不维护后扩展困难

pp中小公司常用SpringCloud、Netflix,SpringCloudAlibaba..

微服务架构下Maven聚合项目的创建方式

聚合项目:类似子父级,一个大的项目,中间包括多个服务,大项目的pom统一依赖版本,定义公共依赖,统一编译和运行环境

POM文件解释

<?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>
    <groupId>包名,组id</groupId>
    <artifactId>项目名称</artifactId>
    父类的pack属性都是pom
    <packaging>pom</packaging>
    <version>1.0-SNAPSHOT</version>
    每次创建子工程,都会自动添加一个module元素
    <modules>
        <module>子工程名称</module>
        <module>子工程名称</module>
        <module>...</module>
    </modules>
    <!--统一依赖版本(子工程都会参考这里的版本定义),
    dependencyManagement 元素只负责定义依赖版本-->
    <dependencyManagement>
        <dependencies>
            <!--定义Spring Boot依赖的版本-->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>2.3.2.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <!--定义Spring Cloud依赖的版本-->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Hoxton.SR9</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <!--定义Spring Cloud Alibaba依赖版本-->
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>2.2.6.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
    <!--定义公共依赖(子工程都需要的依赖,后续子工程需要就不需要添加了)
    写在外面的dependencies为定义公共的依赖
    -->
    <dependencies>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <!--
                    排除junit4这组依赖
                exclusions 定义排除依赖
                exclusion  定义排除的具体依赖
                -->
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
    </dependencies>
    <!--定义统一的编译和运行环境-->
    <build>
        <plugins>
            <plugin>
                
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.1</version>
                <configuration>
                    统一编译的jdk编译和运行环境
                    <source>8</source>
                    <target>8</target>
                    <encoding>UTF-8</encoding>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>

常见异常:

 Error: Could not create the Java Virtual Machine.
Error: A fatal exception has occurred. Program will exit.

解决办法:

 

 依赖下载错误:不分先后

1.检查网络是否有问题

2.清除本地库中的依赖重新下载

3.pom文件中的依赖地址报错,找个地方复制试试

Maven的依赖下载:

https://mvnrepository.com/

或者在csdn中搜索

Q&A【老师的问题】

为什么需要使用微服务?

对于系统分而治之(拆分),解决因并发访问过大带来的系统复杂性,提升可靠性,但会增加维护成本

微服务设计的特点:单一职责,独立进程,开发测试效率高,可靠性高,升级难度小,维护成本会提高

创建聚合工程的目的:

实现工程馆之间的共享,简化工程管理

移除重建项目的删除线

settings->build,execution...->bulid tools->maven->lgnored files

Nacos注册中心入门

服务注册中心诞生背景(服务多了,需要统一管理)

服务注册中心的选择,社区活跃度,稳定性,功能,性能,学习成本

如何基于Nacos实现服务的注册?

添加依赖,配置服务,启动服务并检查

基于RestTemplate实现服务的简单调用?

服务消费方调用服务消费方(很像重定向)

基于LoadBalancerClient实现服务实例的获取?

底层会基于负载均衡算法为我们应用提供实例

如何理解服务注册中心?

存储服务信息的一个服务,也可以理解为一个中介

服务注册中心诞生的背景?

服务多了,需要对服务进行管理

市场上常用的注册中心

Zookeeper,Eureka(奈飞),Nacos(阿里),Consul(谷歌)

Nacos是什么?

Alibaba基于SpringBoot技术实现的一个注册中心,本质上也是web服务

Nacos的基本架构?

Client/Server架构

Nacos主要提供了什么功能?

服务的发现,注册,配置

Nacos服务启动需要什么前置条件?

配置好JDK,MySql5.7+/MD10.5+

Nacos服务单机模式

startyp cmd -m standalone

实现nacos服务注册需要添加哪两个依赖?

spring-cloud-web和alibaba-discovery

实现Nacos服务注册时,必须做那些配置?

服务名,假如是本机服务注册可以省略服务地址

Nacos如何和检查服务状态?

通过心跳包,nacos发送心跳包-BeatInfo,服务停止时间过长后就判定服务关闭。

注册中心这里使用了什么设计模式?

中介者模式,类似代理

服务之间进行服务调用时,使用了什么API?

RestTemplate,用此对象之前要线创建这个对象并且交给Spring管理

RestTemplate对象使用到了什么设计模式?

模板方法模式,一次创建,多地调用【没搜不知道,感觉是】

LoadBalancerClient对象的作用是什么?

服务实例的获取

远程服务调用

基于LoadBatancerClient对象?

@LoadBalanced 注解的应用实践?

Feign方式的服务调用实践?

负载均衡策觉的配置?

常见问题分析

LoadBalancerClient对象的最用?

从nacos获取服务实例,然后在本地负载均衡

LoadBalancerClien对象的具体实现是谁?

RibbonLoadBalancerClient

Ribbon是什么?

一个负载均衡组件,此组件中定义了一些负载均衡算法

@LoadBalanced注解的作用?

描述RestTemplate对象,让底层为此对象赋能

你是如何知道@LooadBatanced是怎么用的?

从官方案例中学习的

你知道那些负载均衡算法?

随机,轮询(权重),hash,重试...

如何配置负载均衡算法?

配置类@Bean,配置文件application.yml...

你是如何理解Feign的?

远程服务调用对象,基于声明式服务调用的定义即可

声明式:明修栈道,暗度陈仓

你是如何使用Feign的?

依赖,配置,接口,熔断处理

能说说基于Feign调用的原理吗

底层代理

服务熔断后你时如何记录错误日志的

Sl4j日志门面

在这里接触到了什么设计模式

门面模式,中介者模式,模板方法,代理模式

门面模式:提供一个统一接口用来访问子系统的一群接口,主要特征时提供了一个高层接口,让子系统更容易使用,属于结构型模式。

什么是配置中心?

存储项目配置信息的一个服务,这个服务可以实现配置的动态发布和更新

为什么使用配置中心?

集中管理配置信息,动态发布配置信息,服务自动感知配置,提高服务可用性

市场上有哪些主流的配置中心?

Apollo nacos

配置中心一般都会配置什么内容?

可能会经常变化的配置信息。例如:连接池,日志级别,线程池,限流熔断规则

项目中为什么要定义bootstrap.yml文件

此文件的读取优先级较高,可以从服务的本地内存中读取

Nacos配置中心宕机了,我们的服务还可以读取到配置信息吗

可以从服务的本地内存中读取

微服务应用中可以如何感知配置中心数据变化?

1.4x版本的nacos客户端会基于长轮询机制从nacos获取配置信息

长轮询:没有访问到就多等一会儿,如果还是没有访问到就先停一会儿,过一会儿再来

短轮询:访问频次多,等待时间短,如果没有访问到就直接走

服务启动后没有从配置中心获取我们的配置数据是什么原因?

1.依赖是否正确

2.bootstrap.yml配置单词,格式,配置模型

日志级别

treac<debug<info<warn<error

选中的日志级别会输出自己和比自己等级更高的日志

RefreshScope注解的作用?

描述从配置中心读取配置信息的类,其目的的是配置中心发生变化,更新类实例,此时类中的实例也会重新初始化

nacos配置管理模型的背景?

环境不懂配置不同

nacos配置中的管理模型是怎样的


版权声明:本文为weixin_62527159原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。