Spring Cloud + Vue前后端分離-第2章 使用Maven搭建SpringCloud項目
Maven兩大核心功能:
????????依賴管理(Jar包管理)
????????構建項目(項目打包)
使用Eureka搭建注冊中心
使用spring initializr創建spring cloud項目
SpringCloud和Maven簡介
SpringBoot和SpringCloud:SpringBoot是單應用開發框架,SpringCloud是管理多個SpringBoot應用的微服務框架
GENERATE下載就可以了
下載完成后是個壓縮包,解壓后,打開idea,點擊filer>open就可以導入項目了
項目初始化,要把代碼管理優先做后,不管是學習還是工作,養成階段性提交代碼的習慣。代碼管理選擇git
一個項目里不是所有的文件都需要提交到git,比如.iml這個是idea本地項目文件,比如maven的target文件夾。所以用.gitignore幫我們自動排除
1.增加eureka子模塊作為注冊服務端
2.將單maven項目改造成maven父子項目
pom.xml(course)
<?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><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.2.2.RELEASE</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.course</groupId><artifactId>course</artifactId><version>0.0.1-SNAPSHOT</version><packaging>pom</packaging><name>course</name><description>Demo project for Spring Boot</description><modules><module>eureka</module></modules><properties><java.version>1.8</java.version><spring-cloud.version>Hoxton.RELEASE</spring-cloud.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies><dependencyManagement><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>${spring-cloud.version}</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build><repositories><repository><id>spring-milestones</id><name>Spring Milestones</name><url>https://repo.spring.io/milestone</url><snapshots><enabled>false</enabled></snapshots></repository></repositories></project>
pom.xml(eureka)
<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><groupId>com.course</groupId><artifactId>course</artifactId><version>0.0.1-SNAPSHOT</version></parent><artifactId>eureka</artifactId><packaging>jar</packaging><name>eureka</name><url>http://maven.apache.org</url><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-server</artifactId></dependency></dependencies>
</project>
搭建業務模塊-system
1.解決注冊中心服務啟動失敗的問題
1.解決注冊中心服務啟動失敗的問題
支持application.properties或application.yml文件,默認會讀取resources目錄下或resources/config目錄下,后續會有讀/config目錄的示例
spring.application.name=eureka
server.port=8761
eureka.client.fetch-registry=false
eureka.client.register-with-eureka=false
springboot默認集成slf4j框架,它定義了一些日志接口,規范日志輸出,真正的實現是logback或log4j,我們代碼中寫的都是slf4j的代碼
2.優化啟動日志顯示
啟動日志可以按需擴展,甚至可以打印一些有趣的字符圖
package com.course;import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.core.env.Environment;/*** Hello world!**/
@SpringBootApplication
@EnableEurekaServer
public class EurekaApplication {private static final Logger logger = LoggerFactory.getLogger(EurekaApplication.class);// public static void main(String[] args) {
// SpringApplication.run(EurekaApplication.class, args);
// }public static void main(String[] args) {SpringApplication app = new SpringApplication(EurekaApplication.class);Environment env = app.run(args).getEnvironment();logger.info("啟動成功!!");logger.info("Eureka地址: \thttp://127.0.0.1:{}", env.getProperty("server.port"));}}
logback.xml
<?xml version="1.0" encoding="UTF-8"?>
<configuration><!-- 修改一下路徑--><property name="PATH" value="/log/imooc/course/eureka"></property><appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"><encoder>
<!-- <Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %highlight(%-5level) %blue(%-50logger{50}:%-4line) %msg%n</Pattern>--><Pattern>%d{ss.SSS} %highlight(%-5level) %blue(%-30logger{30}:%-4line) %msg%n</Pattern></encoder></appender><appender name="TRACE_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"><file>${PATH}/trace.log</file><rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"><FileNamePattern>${PATH}/trace.%d{yyyy-MM-dd}.%i.log</FileNamePattern><timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"><maxFileSize>10MB</maxFileSize></timeBasedFileNamingAndTriggeringPolicy></rollingPolicy><layout><pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %-50logger{50}:%-4line %green(%-8X{UUID}) %msg%n</pattern></layout></appender><appender name="ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"><file>${PATH}/error.log</file><rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"><FileNamePattern>${PATH}/error.%d{yyyy-MM-dd}.%i.log</FileNamePattern><timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"><maxFileSize>10MB</maxFileSize></timeBasedFileNamingAndTriggeringPolicy></rollingPolicy><layout><pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %-50logger{50}:%-4line %green(%-8X{UUID}) %msg%n</pattern></layout><filter class="ch.qos.logback.classic.filter.LevelFilter"><level>ERROR</level><onMatch>ACCEPT</onMatch><onMismatch>DENY</onMismatch></filter></appender><root level="ERROR"><appender-ref ref="ERROR_FILE" /></root><root level="TRACE"><appender-ref ref="TRACE_FILE" /></root><root level="INFO"><appender-ref ref="STDOUT" /></root>
</configuration>
小建議:養成階段性提交代碼的習慣,可以是完成一個小功能。并且每天下班前提交本地代碼,前提是不能編譯報錯或影響已有的功能?
2.新建Maven子項目system
maven父子模塊的配置: 在子模塊中使用parent標簽指向父模塊,在父模塊中使用module標簽引入子模塊
將system配置成最簡單的SpringBoot項目
(注意:java和resources是同級目錄!!!小編大意,求原諒)
package com.course.system;import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.core.env.Environment;@SpringBootApplicationpublic class SystemApplication {private static final Logger logger = LoggerFactory.getLogger(SystemApplication.class);public static void main(String[] args) {SpringApplication app = new SpringApplication(SystemApplication.class);Environment env = app.run(args).getEnvironment();logger.info("啟動成功!!");logger.info("System地址: \thttp://127.0.0.1:{}", env.getProperty("server.port"));}}
spring.application.name=system
server.port=9001
<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><groupId>com.course</groupId><artifactId>course</artifactId><version>0.0.1-SNAPSHOT</version></parent><artifactId>system</artifactId><packaging>jar</packaging><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency></dependencies>
</project>
3.將system注冊到注冊中心
第1步:增加eureka-client依賴
第2步:增加配置,指向注冊中心的地址
第3步:增加@EnableEurekaClient
搭建路由模塊-gateway
SpringCloug的網關組件可以用gateway或zuul,最早使用的是zuul,后面spring自己出了gateway
網關主要功能:
????????限流(流量控制);
????????重試(請求失敗時重試,慎用);
????????跨域(前后端不在同一個域);
????????路由(轉發請求);
????????鑒權(登錄校驗,簽名校驗)等...
新建Maven子項目gateway
步驟和system模塊一樣改一些參數
新增gateway子模塊,增加gateway依賴,并注冊到注冊中心
(注意:java和resources是同級目錄!!!小編大意,求原諒)?
spring.application.name=gateway
server.port=9000
eureka.client.service-url.defaultZone=http://localhost:8761/eureka/#路由轉發
spring.cloud.gateway.routes[0].id=system
spring.cloud.gateway.routes[0].uri=http://127.0.0.1:9001
spring.cloud.gateway.routes[0].predicates[0].name=Path
spring.cloud.gateway.routes[0].predicates[0].args[0]=/system/**
<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><groupId>com.course</groupId><artifactId>course</artifactId><version>0.0.1-SNAPSHOT</version></parent><artifactId>gateway</artifactId><packaging>jar</packaging><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId></dependency></dependencies>
</project>
路由轉發
路由轉發:將外部請求轉發到實際的業務模塊進行處理。
1.在gateway增加system路由轉發配置,調試成功
我們做的所有的改動都需要重啟應用才能生效,后續我們介紹熱部署,不再需要手動重啟,從而提高開發效率