前言
ok,这周是关于课内和Java部分的复习,人工智能那块东西太多了 ,光光一个学习吴恩达的学习笔记我就不知道要整理多少,何况还有别的。所以随缘吧,这周是java部分,课内的其他的东西,例如操作系统什么的,书上写的比我这牛皮的多,只不过java比较特殊,偏向实战,需要动手。当然还有个原因就是这个java期末作业,没时间了,我就打算把原来写的聊天室改成微服务项目,凑合一下,顺便对自己以前玩的复盘,说实话这写东西真的就是以前寒假玩的,这个学习java方面我个人觉得没什么太大长进,一堆事情,所以以后也是打算适当free一下,老子要把经历放在自己感兴趣的地方,去尼玛的比赛,要么别打,要么那个国奖玩玩,省奖什么玩意,浪费时间。
SpringCloud基本体系
SpringCloud 做了一个非常厉害的事情,那就是把我们常用的微服务的组件做了一个整合,并且基于SpringBoot 使得约定大于配置,大大简化了分布式微服务架构的难度。
大体的技术体系我们可以看下图:
当然这里还有很多玩意,例如消息队列(rabbitmq,kafka,分布式搜索,分布式缓存,分布式存储等等这些中间件,总体上技术如上图)
基本上想玩的话,搞个 gateway,openfeign,eureka(nacos) 也能玩了。后面这里应该是会有一个实战的,如何把一共SpringBoot单体项目拆分为分布式微服务项目。没办法,java期末作业就它了,本来是像完成上个学期没有完成的社区的,但是没时间,只能暑假看看有没有空了(第一次发现时间好像不是受我本人支配...)
环境
我们这里采用的环境为idea2021,maven 3.6,java8(万年版本)。然后由于这个SpringCloud和SpringBoot的版本之间是有要求的,所以我们的boot不能乱来,我们需要参考这个表 这个表在官方里面有。 也可以在这里看:https://start.spring.io/actuator/info 不过你需要解析一下(结果如下图): 玩的时候SpringBoot 版本不能太高,所以我这里还是用2.3.x
工程创建
ok,我们先来一开始最容易劝退,然后最容易出现问题的部分,工程创建部分。
由于组件的问题,我们需要先创建一个父工程,原因很简单,第一由于这个版本的问题,我们需要一个父工程来统一配置,做一个版本仲裁,避免出现由于微服务之间组件的版本之间的问题带来的配置灾难。第二个就是由于这个服务可能会比较多确实需要一个父工程来瞅瞅。
那么废话不多说,开始吧,这里也是有基本模板的。
我们先啥也不干,先直接创建一个maven空项目,然后把src文件给我删了。
然后我们开始编写配置。熟悉maven的应该知道这个maven的集成,依赖传递等等。我们先一个一个说吧。
这里注意父工程的packing 为 pom 格式。
其中这个Management是用来做版本仲裁的。
<properties> <maven.compiler.source>8</maven.compiler.source> <maven.compiler.target>8</maven.compiler.target> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.8</java.version> <spring-cloud.version>Hoxton.SR12</spring-cloud.version> <spring-boot.version>2.3.4.RELEASE</spring-boot.version> <spring-cloud-ailibaba.version>2.2.5.RELEASE</spring-cloud-ailibaba.version> <mysql.version>5.1.47</mysql.version> <mybatis.version>2.1.1</mybatis.version> </properties> <dependencyManagement><!-- 传递给子工程的配置--> <dependencies> <!-- springCloud --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>${spring-cloud.version}</version> <type>pom</type> <scope>import</scope> </dependency> <!-- SpringBoot 配置 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-dependencies</artifactId> <version>${spring-boot.version}</version> <type>pom</type> <scope>import</scope> </dependency> <!-- SpringCloud alibaba --> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-alibaba-dependencies</artifactId> <version>${spring-cloud-ailibaba.version}</version> <type>pom</type> <scope>import</scope> </dependency> <!--数据库驱动,前面三个基本上是必用的,再不济前面两个是必备的--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>${mysql.version}</version> </dependency> <!-- mybatis --> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>${mybatis.version}</version> </dependency> </dependencies> </dependencyManagement> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <fork>true</fork> <addResources>true</addResources> </configuration> </plugin> </plugins> </build>
关于scope 为 import 的解释
这里的话需要简单说一下,其实也很简单,首先这个Manage里面的东西呢,是用来做版本仲裁的,只有当子模块使用到了里面的某一个依赖的时候,子模块会自动地去寻找父工程manage里面约定的版本,然后去导入。
但是对于SpringBoot,或者SpringCloud 的依赖而言,他自己本身又有很多依赖,他们自己也做了一个版本仲裁,那个starter里面也是有Manage的。所以当让scope 的值为import 的时候,Maven 会把SpringBoot 或者Cloud里面的Manager里面的约定配置版本也给拿过来。这样做到好处可以总结为2个,第一个是可以使用这种方法来实现多继承。第二个就是避免版本问题,因为你的子模块里面导入的某些依赖在自己定义版本的时候可能会和现在的SpringBoot ,Cloud 出现冲突,导入SpringBoot,Cloud 里面的Manger里面避免这个问题,因为仲裁是他们做好了的,避免版本地狱。
子模块创建
我们这里随便创建几个个玩玩~(后面实战项目再改改,这里先演示玩玩,毕竟好久没玩了)
这个呢,你有多个选择,要么直接创建空的Maven文件,要么直接用SpringInit 先创建一个SpringBoot项目,好处就是会帮你自动创建Application类,但是缺点就是,还要自己改改pom配置文件。但是无论你是用哪种玩意最后你都得改改。
创建之后的项目长这样
我这里这是随便做一个演示,所以的话我这边三个Moudle的依赖一样的。具体的我们实战项目见(我懒得去搞例子了)
之后你刷新一下这个Maven项目 然后我的子项目的配置文件里面,是没有指定这个版本的,说明此时版本仲裁生效
下面是其中一个的配置文件,可以look,look,有需要自己改就完了。 后面实际开发就直接玩你想要导入的组件就完了。
<?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>qimo</artifactId> <groupId>com.huterox</groupId> <version>1.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>cloud_eureka_service8082</artifactId> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build></project>
测试
我们来个Hello world
ok,基本上的其实就这些,关于整合的,其实你导入Cloud 依赖,然后做版本控制就完了,这些其实还是Maven的内容,以前写那个Maven博客的时候漏了不少,因为没有拆来拆去的项目做案例,非要拆的话,把一个单体项目的Controller,Server等等拆成一个个Moudle如果是为了写博客演示的话,这不是我的风格,也必要(博客这玩意还是给自己看的,没必要)
原文:https://juejin.cn/post/7103546728829157406