# 关于微服务和SOA
> 这,仅是我学习过程中记录的笔记。确定了一个待研究的主题,对这个主题进行全方面的剖析。笔记是用来方便我回顾与学习的,欢迎大家与我进行交流沟通,共同成长。不止是技术。
官网教程学习https://www.martinfowler.com/microservices/
## 关于微服务的认识
> 马丁福乐的论文学习
DDD 领域驱动设计
component 组件
### 微服务数据治理与去中心化
任何的服务调用都会出现失败的情况
熔断器
### 微服务的优点和缺点
测试和向后兼容会变的更加的复杂
微服务与传统单体应用项目的区别
### 微服务宏观把控与深度剖析
ESB(企业服务总线)
SOA(面向服务架构)主要针对于企业级,单用ESB,需要序列化和反序列化,采用XML格式传输。
微服务架构主要用于互联网公司。可以独立运行。HTTP+REST+JSON
**单体架构存在的缺点:**
复杂性高,无法按需伸缩,阻碍技术创新,部署速度逐渐编码,技术债务逐渐上升。
### **什么是微服务?**
简而言之,微服务架构风格这种开发方法,是以开发一组小型服务的方式来开发一个独立的应用系统。其中每个小型服务都运行在自己的进程中,并经常采用HTTP资源API这种轻量的机制来相互通信。这些服务为夭折业务功能进行构建通过全自动的部署机制来进行独立部署。这些服务可以用不同的语言来编写,并且可以使用不同的数据存数技术。
![image-20200127145807261](https://tva1.sinaimg.cn/large/006tNbRwly1gbb4n7o3zrj31iw0o6qtp.jpg)
### 微服务是一种架构风格
![image-20200127145936188](https://tva1.sinaimg.cn/large/006tNbRwly1gbb4opal6ij31i20tcts2.jpg)
### 微服务的优点与挑战
![image-20200127150022823](https://tva1.sinaimg.cn/large/006tNbRwly1gbb4pi7fvsj31f00tknd7.jpg)
![image-20200127150652519](https://tva1.sinaimg.cn/large/006tNbRwly1gbb4w8ymhoj31jg0noq84.jpg)
![image-20200127150607199](https://tva1.sinaimg.cn/large/006tNbRwly1gbb4vgyzgoj31mu0m60xz.jpg)
### 微服务具备的特性和设计原则
![image-20200127150325956](https://tva1.sinaimg.cn/large/006tNbRwly1gbb4sod22ej31ju0jck3e.jpg)
![image-20200127150842427](https://tva1.sinaimg.cn/large/006tNbRwly1gbb4y5sxehj31eu0imn11.jpg)
## SOA理论和概念
SOA: Service oriented architecture 面向服务架构风格
> SOA和微服务的差别
![image-20200127152525733](https://tva1.sinaimg.cn/large/006tNbRwly1gbb5fkrko0j31hi0hotxc.jpg)
![image-20200127153134837](https://tva1.sinaimg.cn/large/006tNbRwly1gbb5lz86fqj31i60l24qp.jpg)
### SOA原则:
![image-20200127154825504](https://tva1.sinaimg.cn/large/006tNbRwly1gbb63i2jd3j31dj0u07wh.jpg)
### SOA的设计模式:
![image-20200127163234152](https://tva1.sinaimg.cn/large/006tNbRwly1gbb7dgyzabj31ia0hyhat.jpg)
### 实现方法:
![image-20200127164039613](https://tva1.sinaimg.cn/large/006tNbRwly1gbb7lx9t0yj31ia0gg1c9.jpg)
### SOA带来的好处:
![image-20200127164759048](https://tva1.sinaimg.cn/large/006tNbRwly1gbb7tnfly9j31ds0u0u0x.jpg)
### SOA的缺点:
![image-20200127165053612](https://tva1.sinaimg.cn/large/006tNbRwly1gbb7wnoes2j31i00m61kx.jpg)
SOA中微服务的介绍总结:
![image-20200127172101785](https://tva1.sinaimg.cn/large/006tNbRwly1gbb8rud6pjj31fe0eutoe.jpg)
微服务的缺点介绍:
![image-20200127172834338](https://tva1.sinaimg.cn/large/006tNbRwly1gbb8zp9g9jj31f40cs7j3.jpg)
## SOA与微服务的差别
> SOA 着眼于企业,应用与应用。最大化的应用服务的可重用性,力度更大,
>
> 微服务 着眼于单个的应用,注重于解耦。力度更小。
![image-20200127175008659](/Users/erwa/Library/Application Support/typora-user-images/image-20200127175008659.png)
![image-20200127175953647](https://tva1.sinaimg.cn/large/006tNbRwly1gbb9wc0qicj31f20r2tra.jpg)
SOA和微服务的区别、
![image-20200127180146354](https://tva1.sinaimg.cn/large/006tNbRwly1gbb9y8xabfj31hs0a0gts.jpg)
![image-20200127180303318](https://tva1.sinaimg.cn/large/006tNbRwly1gbb9zkpvnbj315k0u0avw.jpg)
![image-20200127180450791](https://tva1.sinaimg.cn/large/006tNbRwly1gbba1gnz1qj317h0u0b29.jpg)
![image-20200127180525821](https://tva1.sinaimg.cn/large/006tNbRwly1gbba21ga8zj31ig0ba11f.jpg)
结论:
![image-20200127180659827](https://tva1.sinaimg.cn/large/006tNbRwly1gbba3ojlpvj31l20f27h2.jpg)
# SpringBoot
SpringBoot应用起步与配置
## 创建第一个可以运行的springboot项目
> 约定大于配置
在官网使用Spring initializr创建一个gradle的springboot项目使用vscode启动。
### 遇到了问题,连不上vpn 依赖下载不动。经过不懈的努力。启动成功。
![image-20200128115450296](https://tva1.sinaimg.cn/large/00831rSTly1gcvdi8bf1hj317m04qjs5.jpg)
![image-20200128120842617](https://tva1.sinaimg.cn/large/006tNbRwly1gbc5d6gvp9j32440bodio.jpg)
**Apollo(阿波罗)是携程框架部门研发的分布式配置中心,能够集中化管理应用不同环境、不同集群的配置,配置修改后能够实时推送到应用端,并且具备规范的权限、流程治理等特性,适用于微服务配置管理场景。服务端基于Spring Boot和Spring Cloud开发,打包后可以直接运行,不需要额外安装Tomcat等应用容器。**
### springBoot 提供了两种配置的文件形式:
1. Properties 文件形式: server.port=9090
2. yml文件形式 server:
prot:9090
### springboot打包文件内容与结构分析
> bootJar : 将项目打成了一个jar包 , 可以直接运行的jar包
![image-20200128121928235](https://tva1.sinaimg.cn/large/006tNbRwly1gbc5odysv6j31az0u0wmg.jpg)
> jar 命令: 查看当前的jar命令操作。
>
> unzip : 解压缩到一个目录里,如图
![image-20200128122605639](https://tva1.sinaimg.cn/large/006tNbRwly1gbc5v9sgvgj30s401agn2.jpg)
### 打成的jar包的目录:
> ├── BOOT-INF
> │ ├── classes
> │ │ ├── application.properties
> │ │ ├── com
> │ │ │ └── test
> │ │ │ └── demo
> │ │ │ └── DemoApplication.class
> │ │ ├── static
> │ │ └── templates
> │ └── lib
> │ ├── classmate-1.5.1.jar
> │ ├── hibernate-validator-6.0.18.Final.jar
> │ ├── jackson-annotations-2.10.2.jar
> │ ├── jackson-core-2.10.2.jar
> │ ├── jackson-databind-2.10.2.jar
> │ ├── jackson-datatype-jdk8-2.10.2.jar
> │ ├── jackson-datatype-jsr310-2.10.2.jar
> │ ├── jackson-module-parameter-names-2.10.2.jar
> │ ├── jakarta.annotation-api-1.3.5.jar
> │ ├── jakarta.validation-api-2.0.2.jar
> │ ├── jboss-logging-3.4.1.Final.jar
> │ ├── jul-to-slf4j-1.7.30.jar
> │ ├── log4j-api-2.12.1.jar
> │ ├── log4j-to-slf4j-2.12.1.jar
> │ ├── logback-classic-1.2.3.jar
> │ ├── logback-core-1.2.3.jar
> │ ├── slf4j-api-1.7.30.jar
> │ ├── snakeyaml-1.25.jar
> │ ├── spring-aop-5.2.3.RELEASE.jar
> │ ├── spring-beans-5.2.3.RELEASE.jar
> │ ├── spring-boot-2.2.4.RELEASE.jar
> │ ├── spring-boot-autoconfigure-2.2.4.RELEASE.jar
> │ ├── spring-boot-starter-2.2.4.RELEASE.jar
> │ ├── spring-boot-starter-json-2.2.4.RELEASE.jar
> │ ├── spring-boot-starter-logging-2.2.4.RELEASE.jar
> │ ├── spring-boot-starter-tomcat-2.2.4.RELEASE.jar
> │ ├── spring-boot-starter-validation-2.2.4.RELEASE.jar
> │ ├── spring-boot-starter-web-2.2.4.RELEASE.jar
> │ ├── spring-context-5.2.3.RELEASE.jar
> │ ├── spring-core-5.2.3.RELEASE.jar
> │ ├── spring-expression-5.2.3.RELEASE.jar
> │ ├── spring-jcl-5.2.3.RELEASE.jar
> │ ├── spring-web-5.2.3.RELEASE.jar
> │ ├── spring-webmvc-5.2.3.RELEASE.jar
> │ ├── tomcat-embed-core-9.0.30.jar
> │ ├── tomcat-embed-el-9.0.30.jar
> │ └── tomcat-embed-websocket-9.0.30.jar
> ├── META-INF
> │ └── MANIFEST.MF -- 清单文件
> └── org
> └── springframework
> └── boot
> └── loader
> ├── ExecutableArchiveLauncher.class
> ├── archive
> │ ├── Archive$Entry.class
> │ └── JarFileArchive.class
> ├── data
> │ ├── RandomAccessData.class
> │ ├── RandomAccessDataFile$1.class
> │ ├── RandomAccessDataFile$DataInputStream.class
> │ ├── RandomAccessDataFile$FileAccess.class
> │ └── RandomAccessDataFile.class
> ├── jar
> │ ├── AsciiBytes.class
>
> ├── JarLauncher.class
### META-INF中的MANIFEST.MF 清单文件
> ➜ META-INF cat MANIFEST.MF
> Manifest-Version: 1.0
> Start-Class: com.test.demo.DemoApplication
> Spring-Boot-Classes: BOOT-INF/classes/
> Spring-Boot-Lib: BOOT-INF/lib/
> Spring-Boot-Version: 2.2.4.RELEASE
> Main-Class: org.springframework.boot.loader.JarLauncher
## 使用gradle搭建springboot第二个项目
### build.gradle
这个地方遇到了一个小插曲。没有网,gradle构建失败,跟着视频上敲的springboot版本找不到。然后直接使用idea构建了一个springboot的项目。build.gradle内容如下:
```java
plugins {
id 'org.springframework.boot' version '2.2.4.RELEASE'
id 'io.spring.dependency-management' version '1.0.9.RELEASE'
id 'java'
}
group = 'com.erwa'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '1.8'
repositories {
mavenCentral()
}
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-web'
testImplementation('org.springframework.boot:spring-boot-starter-test') {
exclude group: 'org.junit.vintage', module: 'junit-vintage-engine'
}
}
test {
useJUnitPlatform()
}
```
#### springboot项目的执行方式有三种:
1. 直接运行启动类main方法
2. 通过gradle, bootRun 启动
3. 通过命令行的方式
#### 小插曲,在这里,配置了一下Mac环境下的gradle的环境变量
### springboot参数自动装配练习与loader机制
```yml
MyConfig:
erwaage: 20
erwaname: erwa
```
```java
@Value("${MyConfig.erwaname}")
private String erwaname ;
@Value("${MyConfig.erwaage}")
private String erwaage;
```
@AutoWired @configration @Bean
```java
@Configuration
public class MyConfig {
@Bean
public MyConfig myConfig(){
return new MyConfig();
}
}
@Autowired
private MyConfig myConfig;
```
> java -jar xxx.jar 直接运行jar包
>
> 打包后的jar包中的org目录来自于 spring-boot-loader包
### spring_boot_Loader源码分析及自定义类加载器的作用
> gradle bootJar : 将项目打成jar包
>
> java -jar xxx.jar : 运行jar包
>
> 能使用命令尽量使用命令。不然浪费了Mac
JarLauncher类
ClassLoader 类加载器,JVM课程中深入理解。
应用类加载器加载jar包中org中的jar文件。自定义类加载器加载BOOT-INF包中的jar文件
launchedURLClassLoader()
**自己跟代码 **
#### 为什么启动类要用main方法?举例拿代码来说明一下。
用别的方法其实也可以。是因为要在ide中支持直接运行启动方法。换成别的名字的话就不能直接通过IDE启动了。
```java
package com.erwa.boot.testMain;
public class MyMain {
public static void main1(String[] args) {
System.out.println("hello 你好");
}
}
```
```java
package com.erwa.boot.testMain;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class MyMain2 {
public static void main(String[] args) throws Exception{
Class<?> myMainClass = MyMain.class;
Method main = myMainClass.getDeclaredMethod("main1", String[].class);
main.invoke(null,new Object[]{null});
}
}
通过反射的方式运行第一个main1方法。
```
#### 通过不同方式启动,使用的类加载器是否一样的呢?不一样的,结果如下
```Java
public static void main(String[] args) {
System.out.println(BootApplication.class.getClassLoader()+"123");
SpringApplication.run(BootApplication.class, args);
}
```
> main方法启动的类加载器:
>
> sun.misc.Launcher$AppClassLoader@18b4aac2123
>
> 通过jar包的方式启动的类加载器:
>
> org.springframework.boot.loder.launchedURLClassLoader@659e0bfd123
### JDWP:远程调试详解
不通过IDE进行debug调试的方法。通过远程进行调试。
JDWP: Java Debug wire Protocol, Java调试协议。
```shell
~ java -agentlib:jdwp=help
Java Debugger JDWP Agent Library
--------------------------------
(see http://java.sun.com/products/jpda for more information)
jdwp usage: java -agentlib:jdwp=[help]|[