微服务诞生的背景
普通写的程序大而全,但是一旦其中一项出现问题,整个服务将会瘫痪。微服务架构就是将一个大系统拆分成若干个小系统,其中一个服务瘫痪后,其他业务照样可以运行。
例子:一个大型火车站可以通往各地,当火车站出现断网等意外时,整个火车站就将瘫痪。微服务就是建造多个火车站分别负责东西南北各个位置,一个方向瘫痪时,其他火车站依旧可以完成客运任务。
微服务架构解决方案
大厂使用自研的微服务框架,防止使用开源的框架,框架不维护后扩展困难
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的依赖下载:
或者在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配置中的管理模型是怎样的