疑問?
既然已經(jīng)引入了spring-boot-starter-parent作為父工程,為什么還需要加父工程 里已有的打包插件愈涩,同理spring-boot-dependencies也已經(jīng)添加好依賴了彪笼,為什么在自己的springboot項(xiàng)目還要加依賴
- spring-boot-dependencies中的依賴是放在<dependencyManagement>標(biāo)簽中的拷获,如果子項(xiàng)目沒有聲明依賴玉转,這些在<dependencyManagement>標(biāo)簽中的依賴是不會自動引入在子項(xiàng)目的持际。
疑問?
使用了thymeleaf模板引擎技術(shù)的的HTML頁面也是通過model對象傳遞數(shù)據(jù)到前端頁面沃琅,和JSP技術(shù)好像也是一樣,具體有什么區(qū)別蜘欲?
疑問?
springboot為什么可以打成jar包益眉,直接運(yùn)行?
- 內(nèi)部引用了tomcat姥份,實(shí)際上也是通過tomcat來啟動項(xiàng)目
SpringBoot??
為什么要有SpringBoot?
- 使用原先的SSM方式去搭建項(xiàng)目效率較低郭脂,需要配置大量的依賴和配置文件,以及考慮依賴之間的兼容性問題澈歉。
- 有了SpringBoot就可以簡化項(xiàng)目的配置和依賴的使用展鸡,提高開發(fā)效率
約定優(yōu)于配置(Convention over Configuration),又稱按約定編程埃难,是一種軟件設(shè)計(jì)范式莹弊。
本質(zhì)上是說,系統(tǒng)涡尘、類庫或框架應(yīng)該假定合理的默認(rèn)值忍弛,而非要求提供不必要的配置。比如說模型中有一個(gè)名為User的類考抄,那么數(shù)據(jù)庫中對應(yīng)的表就會默認(rèn)命名為user细疚。只有在偏離這一個(gè)約定的時(shí)候,例如想要將該表命名為person川梅,才需要寫有關(guān)這個(gè)名字的配置疯兼。
Spring優(yōu)缺點(diǎn)分析
優(yōu)點(diǎn):
Spring是Java企業(yè)版(Java Enterprise Edition,JEE贫途,也稱J2EE)的輕量級代替品吧彪。無需開發(fā)重量級的Enterprise Java Bean(EJB),Spring為企業(yè)級Java開發(fā)提供了一種相對簡單的方法丢早,通過依賴注入和面向切面編程来氧,用簡單的Java對象(Plain Old Java Object,POJO)實(shí)現(xiàn)了EJB的功能。
缺點(diǎn):
雖然Spring的組件代碼是輕量級的啦扬,但它的配置卻是重量級的**。一開始凫碌,Spring用XML配置扑毡,而且是很多XML配 置。Spring 2.5引入了基于注解的組件掃描盛险,這消除了大量針對應(yīng)用程序自身組件的顯式XML配置瞄摊。Spring 3.0引入 了基于Java的配置,這是一種類型安全的可重構(gòu)配置方式苦掘,可以代替XML换帜。所有這些配置都代表了開發(fā)時(shí)的損耗。因?yàn)樵谒伎糞pring特性配置和解決業(yè)務(wù)問題之間需要進(jìn)行思維切換鹤啡,所以編寫配置擠占了編寫應(yīng)用程序邏輯的時(shí)間惯驼。和所有框架一樣,Spring實(shí)用递瑰,但與此同時(shí)它要求的回報(bào)也不少祟牲。
項(xiàng)目的依賴管理也是一件耗時(shí)耗力的事情。在環(huán)境搭建時(shí)抖部,需要分析要導(dǎo)入哪些庫的坐標(biāo)说贝,而且還需要分析導(dǎo)入與之有依賴關(guān)系的其他庫的坐標(biāo),一旦選錯(cuò)了依賴的版本慎颗,隨之而來的不兼容問題就會嚴(yán)重阻礙項(xiàng)目的開發(fā)進(jìn)度
SSM整合:Spring乡恕、Spring MVC、Mybatis俯萎、Spring-Mybatis整合包傲宜、數(shù)據(jù)庫驅(qū)動,引入依賴的數(shù)量繁多讯屈、容易存在版本沖突蛋哭。
SpringBoot的兩大特點(diǎn)
-
起步依賴
- 起步依賴本質(zhì)上是一個(gè)Maven項(xiàng)目對象模型(Project Object Model,POM)涮母,定義了對其他庫的傳遞依賴谆趾,這些東西加在一起即支持某項(xiàng)功能。
- 也就是每個(gè)springboot項(xiàng)目都會依賴一個(gè)配置好的springboot父工程叛本,父工程已經(jīng)做好了依賴的版本控制沪蓬,編碼格式等默認(rèn)配置
-
自動配置
- springboot會自動將一些配置類的bean注冊進(jìn)ioc容器,我們可以需要的地方使用@autowired或者@resource等注解來使用它来候。如果需要個(gè)性化的配置只需要在application.yml文件中配置即可跷叉。
SpringBoot快速入門
-
POM文件
<!-- 所用的springBoot項(xiàng)目都會直接或者間接的繼承spring-boot-starter-parent 1.指定項(xiàng)目的編碼格式為UTF-8 2.指定JDK版本為1.8 3.對項(xiàng)目依賴的版本進(jìn)行管理,當(dāng)前項(xiàng)目再引入其他常用的依賴時(shí)就需要再指定版本號,避免版本 沖突的問題 4.默認(rèn)的資源過濾和插件管理 --> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.3.4.RELEASE</version> </parent> <dependencies> <!--引入Spring Web及Spring MVC相關(guān)的依賴--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> </dependencies> <!--可以將project打包為一個(gè)可以執(zhí)行的jar--> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build>
-
啟動類
/** * SpringBoot的啟動類通常放在二級包中云挟,比如:com.lagou.SpringBootDemo1Application * 因?yàn)镾pringBoot項(xiàng)目在做包掃描梆砸,會掃描啟動類所在的包及其子包下的所有內(nèi)容。 */ //標(biāo)識當(dāng)前類為SpringBoot項(xiàng)目的啟動類 @SpringBootApplication public class SpringBootDemo1Application { public static void main(String[] args) { //樣板代碼 SpringApplication.run(SpringBootDemo1Application.class,args); } }
-
Controller
@RestController @RequestMapping("/hello") public class HelloController { @RequestMapping("/boot") public String helloBoot(){ return "Hello Spring Boot"; } }
默認(rèn)啟動項(xiàng)目的端口是8080园欣,可以在application.yml文件中修改
單元測試
-
在pom.xml文件中添加測試依賴
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency>
-
測試類
/** * SpringJUnit4ClassRunner.class:Spring運(yùn)行環(huán)境 * JUnit4.class:JUnit運(yùn)行環(huán)境 * SpringRunner.class:Spring Boot運(yùn)行環(huán)境 */ @RunWith(SpringRunner.class) //@RunWith:運(yùn)行器 @SpringBootTest //標(biāo)記為當(dāng)前類為SpringBoot測試類 class Springbootdemo2ApplicationTests { /*** 需求:調(diào)用HelloController的hello方法 */ @Autowired private HelloController helloController; @Test void contextLoads() { String result = helloController.hello(); System.out.println(result); } }
熱部署:在修改完代碼之后帖世,不需要重新啟動容器,就可以實(shí)現(xiàn)更新沸枯。
使用步驟
1)添加SpringBoot的熱部署依賴啟動器
2)開啟Idea的自動編譯
3)開啟Idea的在項(xiàng)目運(yùn)行中自動編譯的功能
-
POM文件
<!-- 引入熱部署依賴 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> </dependency>
-
IDEA工具熱部署設(shè)置
選擇IDEA工具界面的【File】->【Settings】選項(xiàng)日矫,打開Compiler面板設(shè)置頁面
<img src="https://raw.githubusercontent.com/RogerJack-ace/picgo/master/image-20201018173958066.png" />
在項(xiàng)目任意頁面中使用組合快捷鍵“Ctrl+Shift+Alt+/”打開Maintenance選項(xiàng)框,選中并打開Registry頁面绑榴,
[圖片上傳失敗...(image-803e98-1603627257896)]
使用application.yml文件給bean對象注入數(shù)據(jù)
- 實(shí)體類
@Component
//將配置文件中所有以person開頭的配置信息注入當(dāng)前類中
//前提1:必須保證配置文件中person.xx與當(dāng)前Person類的屬性名一致
//前提2:必須保證當(dāng)前Person中的屬性都具有set方法
@ConfigurationProperties(prefix = "person")
public class Person {
private int id; //id
private String name; //名稱
private List hobby; //愛好
private String[] family; //家庭成員
private Map map;
private Pet pet; //寵物
//省略了 對應(yīng)屬性的 set方法...
}
-
配置文件
#對實(shí)體類對象Person進(jìn)行屬性配置 person: id: 1 name: 王二麻子 family: - 妻 - 妾 hobby: - play - read - sleep map: k1: value1 k2: value2 pet: type: 狗 name: 哈士奇
如果有多個(gè)配置文件哪轿,默認(rèn).properties的優(yōu)先級最高,根據(jù)在父工程中引入的pom文件
也可以使用@value注解給屬性賦值翔怎,但是只可以給string類型的屬性賦值
@Component
public class Student {
@Value("${person.id}")
private int id;
@Value("${person.name}")
private String name; //名稱
//省略set方法
}
自定義配置
-
使用@PropertySource加載配置文件
- 可以不使用spring boot默認(rèn)給的配置文件窃诉,自己創(chuàng)建配置文件,如my.properties
#對實(shí)體類對象MyProperties進(jìn)行屬性配置
test.id=110
test.name=test
創(chuàng)建一個(gè)配置類MyProperties姓惑,提供test.properties自定義配置文件中對應(yīng)的屬性褐奴,并根據(jù)@PropertySource注解的使用進(jìn)行相關(guān)配置
@Component // 自定義配置類
@PropertySource("classpath:test.properties") // 指定自定義配置文件位置和名稱
@ConfigurationProperties(prefix = "test") // 指定配置文件注入屬性前綴
public class MyProperties {
private int id;
private String name;
// 省略屬性getXX()和setXX()方法
// 省略toString()方法 }
- 使用@Configuration編寫自定義配置類
@Configuration // 定義該類是一個(gè)配置類
public class MyConfig {
@Bean // 將返回值對象作為組件添加到Spring容器中,該組件id默認(rèn)為方法名
public MyService myService(){
return new MyService();
}
}
為什么導(dǎo)入dependency時(shí)不需要指定版本于毙?
- 每個(gè)spring boot項(xiàng)目都有父依賴spring-boot-starter-parent敦冬,而spring-boot-starter-parent POM文件中又引入了spring-boot-dependencies父依賴,在這個(gè)父依賴中聲明了當(dāng)前項(xiàng)目的所有可能需要的依賴的版本唯沮,所以在自己的項(xiàng)目中不需要指定版本脖旱,spring boot已經(jīng)幫你配置好版本了
Spring Boot****到底是如何進(jìn)行自動配置的,都把哪些組件進(jìn)行了自動配置介蛉?
|- @SpringBootConfiguration
|- @Configuration //通過javaConfig的方式來添加組件到IOC容器中
|- @EnableAutoConfiguration
|- @AutoConfigurationPackage //自動配置包萌庆,與@ComponentScan掃描到的添加到IOC
|- @Import(AutoConfigurationImportSelector.class) //到META- INF/spring.factories中定義的bean添加到IOC容器中
|- @ComponentScan //包掃描
疑問?
mybatis-plus插件的使用,沒有看到sql的編寫币旧,是怎么實(shí)現(xiàn)的践险?
SpringCloud??
項(xiàng)目中遇到的問題?
- order是關(guān)鍵字,不能用來作為表名
- 使用host文件配置域名映射時(shí)吹菱,只能映射到ip上巍虫,不能加端口號,默認(rèn)是80端口
- nginx配置反向代理的時(shí)候也是需要使用80端口
- nginx的默認(rèn)輪詢策略是一個(gè)接口調(diào)<b style="color:red">兩次</b>再換另一個(gè)接口
@PathVariable的作用鳍刷?
- 在默認(rèn)情況下占遥,@PathVariable注解的參數(shù)可以是一些基本的簡單類型:int,long输瓜,Date瓦胎,String等芬萍,Spring能根據(jù)URL變量的具體值以及函數(shù)參數(shù)的類型來進(jìn)行轉(zhuǎn)換
- 識別url中占位符的數(shù)據(jù),并自動賦值到同名形參變量上
SpringCloud 核心組件
- Eureka 注冊中心
- Ribbon 負(fù)載均衡
- Hystrix 熔斷器
- Feign (遠(yuǎn)程調(diào)用+Ribbon+Hystrix)
- Gateway 網(wǎng)關(guān)
- Spring Cloud Config 配置中心
單例注冊中心
- 父工程中加入spring cloud的依賴
<!--管理依賴搔啊,主要作用是版本管理柬祠,子項(xiàng)目中不會自動導(dǎo)入管理依賴中的所有依賴,只會導(dǎo)入聲明的依賴-->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Greenwich.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
- eureka工程中加入eureka的依賴
<!--Eureka server依賴-->
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
</dependencies>
- 配置文件application.yml
server:
port: 9300
spring:
application:
name: lagou-cloud-eureka # 應(yīng)用名稱负芋,會在Eureka中作為服務(wù)的id標(biāo)識(serviceId)
eureka:
instance:
hostname: localhost
client:
service-url:
# 客戶端與EurekaServer交互的地址瓶盛,如果是集群,也需要寫其它Server的地址
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
register-with-eureka: false # 自己就是服務(wù)不需要注冊自己
fetch-registry: false #自己就是服務(wù)不需要從Eureka Server獲取服務(wù)信息,默認(rèn)為true示罗,置為false
- 創(chuàng)建啟動類EurekaApplication,加入注解@EnableEurekaServer
- 訪問localhost:9300
集群注冊中心
- 在單例的基礎(chǔ)上芝硬,復(fù)制出另一個(gè)工程蚜点,把端口號+1
- 在本地測試的時(shí)候,修改host文件
127.0.0.1 LagouCloudEurekaServerA
127.0.0.1 LagouCloudEurekaServerB
- 修改配置文件
server:
port: 9300
spring:
application:
name: lagou-cloud-eureka # 應(yīng)用名稱拌阴,會在Eureka中作為服務(wù)的id標(biāo)識(serviceId)
eureka:
instance:
hostname: LagouCloudEurekaServerA
#hostname: LagouCloudEurekaServerB 另一項(xiàng)目
client:
service-url:
# 客戶端與EurekaServer交互的地址绍绘,如果是集群,也需要寫其它Server的地址
defaultZone: http://LagouCloudEurekaServerB:9301/eureka
#defaultZone: http://LagouCloudEurekaServerA:9300/eureka 另一項(xiàng)目
register-with-eureka: false # 自己就是服務(wù)不需要注冊自己
fetch-registry: false #自己就是服務(wù)不需要從Eureka Server獲取服務(wù)信息,默認(rèn)為true迟赃,置為false
微服務(wù)注冊到注冊中心
- 在項(xiàng)目中加入eureka-client的依賴
<!--Eureka client-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
- 配置application.yaml文件
server:
port: 9100 # 后期該微服務(wù)多實(shí)例陪拘,9000(10個(gè)以內(nèi))
spring:
#解決bean重復(fù)注冊問題
main:
allow-bean-definition-overriding: true
application:
name: lagou-service-order
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/lagou?useUnicode=true&characterEncoding=utf8&serverTimezone=UTC
username: root
password: 123456
cloud:
#config客戶端配置,和ConfigServer通信,并告知ConfigServer希望獲取的配置信息在哪個(gè)文件中
config:
name: application
profile:
label: master #分支名稱
uri: http://localhost:9400 #ConfigServer配置中心地址
#通知刷新
rabbitmq:
host: 192.168.64.128
username: roger
password: 123456
# 向注冊中心聲明
eureka:
client:
serviceUrl: # eureka server的路徑
defaultZone: http://LagouCloudEurekaServerA:9300/eureka,http://LagouCloudEurekaServerB:9301/eureka
instance:
#使用ip注冊纤壁,否則會使用主機(jī)名注冊了(此處考慮到對老版本的兼容左刽,新版本經(jīng)過實(shí)驗(yàn)都是ip)
prefer-ip-address: true
#自定義實(shí)例顯示格式,加上版本號酌媒,便于多版本管理欠痴,注意是ip-address,早期版本是ipAddress
instance-id: ${spring.cloud.client.ip-address}:${spring.application.name}:${server.port}:@project.version@
- 啟動類上加注解 @EnableDiscoveryClient
- 啟動后就能在注冊中心發(fā)現(xiàn)已注冊
Ribbon使用秒咨,不加Feign
使用
- 在消費(fèi)者項(xiàng)目的RestTemplate方法上加@loadBalance
- 在提供者項(xiàng)目編寫一個(gè)獲取當(dāng)前項(xiàng)目端口的方法喇辽,并且提供者項(xiàng)目做集群。
- 在消費(fèi)者調(diào)用提供者
Hystrix
疑問?
配置在application文件中的熔斷器配置指定了并發(fā)執(zhí)行的最大線程數(shù)和最大隊(duì)列數(shù)雨席,是所有接口用一個(gè)線程池還是每個(gè)接口用一個(gè)
Feign使用
- 父工程引入openfeign依賴
<!--OpenFeign依賴-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
- 消費(fèi)者啟動類加上@EnableFeignClients
- 創(chuàng)建一個(gè)接口菩咨,用來遠(yuǎn)程調(diào)用,需要提供者的同名方法陡厘,類上加@FeignClient("提供者注冊名")
@FeignClient("lagou-service-goods",fallback = GoodFeignFallback.class)
public interface GoodFeign {
// 要帶上父路徑3槊住!3恰缨硝!
@RequestMapping("/good/queryByIds")
public List<Good> queryByIds(@RequestBody List<Integer> ids);
}
使用Feign,整合Ribbon
- 父工程引入 OpenFeign依賴
<!--OpenFeign依賴-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
- 消費(fèi)者項(xiàng)目配置文件
#針對的被調(diào)用方微服務(wù)名稱,不加就是全局生效
lagou-service-goods:
ribbon:
#請求連接超時(shí)時(shí)間
ConnectTimeout: 2000
#請求處理超時(shí)時(shí)間
ReadTimeout: 15000
#對所有操作都進(jìn)行重試
OkToRetryOnAllOperations: true
####根據(jù)如上配置,當(dāng)訪問到故障請求的時(shí)候罢低,它會再嘗試訪問一次當(dāng)前實(shí)例(次數(shù)由MaxAutoRetries配置)查辩,
####如果不行胖笛,就換一個(gè)實(shí)例進(jìn)行訪問,如果還不行宜岛,再換一次實(shí)例訪問(更換次數(shù)由MaxAutoRetriesNextServer配置)长踊,
####如果依然不行,返回失敗信息萍倡。
MaxAutoRetries: 0 #對當(dāng)前選中實(shí)例重試次數(shù)身弊,不包括第一次調(diào)用
MaxAutoRetriesNextServer: 0 #切換實(shí)例的重試次數(shù)
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.ZoneAvoidanceRule #負(fù)載策略調(diào)整
使用Feign,整合Hystrix
- 父工程添加hystrix依賴
<!--熔斷器Hystrix-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
- 配置消費(fèi)者項(xiàng)目配置文件
# 配置熔斷策略:
hystrix:
command:
default:
circuitBreaker:
# 強(qiáng)制打開熔斷器列敲,如果該屬性設(shè)置為true阱佛,強(qiáng)制斷路器進(jìn)入打開狀態(tài),將會拒絕所有的請求戴而。 默認(rèn)false關(guān)閉的
forceOpen: false
# 觸發(fā)熔斷錯(cuò)誤比例閾值凑术,默認(rèn)值50%
errorThresholdPercentage: 50
# 熔斷后休眠時(shí)長,默認(rèn)值5秒
sleepWindowInMilliseconds: 3000
# 熔斷觸發(fā)最小請求次數(shù)所意,默認(rèn)值是20
requestVolumeThreshold: 2
execution:
isolation:
thread:
# 熔斷超時(shí)設(shè)置淮逊,默認(rèn)為1秒,超過五秒還未返回結(jié)果就降級處理
timeoutInMilliseconds: 5000
threadpool:
default:
coreSize: 16 #并發(fā)執(zhí)行的最大線程數(shù)扶踊,默認(rèn)10
maxQueueSize: 1000 #BlockingQueue的最大隊(duì)列數(shù)泄鹏,默認(rèn)值-1
queueSizeRejectionThreshold: 600 #即使maxQueueSize沒有達(dá)到,達(dá)到 queueSizeRejectionThreshold該值后秧耗,請求也會被拒絕备籽,默認(rèn)值5
#開啟Feign對熔斷器支持
feign:
hystrix:
enabled: true
#開啟請求和響應(yīng)的壓縮設(shè)置,默認(rèn)是不開啟的
compression:
request:
enabled: true
mime-types: text/xml,application/xml,application/json #默認(rèn)值
min-request-size: 2048
response:
enabled: true
- 創(chuàng)建降級處理類绣版,實(shí)現(xiàn)feign接口胶台,加@component
@Component
public class GoodFeignFallback implements GoodFeign {
@Override
public List<Good> queryByIds(List<Integer> ids) {
return Collections.EMPTY_LIST;
}
Gateway網(wǎng)關(guān)
一個(gè)請求—>網(wǎng)關(guān)根據(jù)一定的條件匹配—匹配成功之后可以將請求轉(zhuǎn)發(fā)到指定的服務(wù)地址;而在這 個(gè)過程中杂抽,我們可以進(jìn)行一些比較具體的控制(限流诈唬、日志、黑白名單)
- 單獨(dú)創(chuàng)建網(wǎng)關(guān)項(xiàng)目缩麸,導(dǎo)入依賴
<!--spring boot 父啟動器依賴-->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.6.RELEASE</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-commons</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency> <!--GateWay 網(wǎng)關(guān)-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency> <!--引入webflux-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webflux</artifactId>
</dependency> <!--日志依賴-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</dependency> <!--測試依賴-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!--lombok工具-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.4</version>
<scope>provided</scope>
</dependency>
<!--引入Jaxb铸磅,開始-->
<dependency>
<groupId>com.sun.xml.bind</groupId>
<artifactId>jaxb-core</artifactId>
<version>2.2.11</version>
</dependency>
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
</dependency>
<dependency>
<groupId>com.sun.xml.bind</groupId>
<artifactId>jaxb-impl</artifactId>
<version>2.2.11</version>
</dependency>
<dependency>
<groupId>org.glassfish.jaxb</groupId>
<artifactId>jaxb-runtime</artifactId>
<version>2.2.10-b140310.1920</version>
</dependency>
<dependency>
<groupId>javax.activation</groupId>
<artifactId>activation</artifactId>
<version>1.1.1</version>
</dependency>
<!--引入Jaxb,結(jié)束-->
<!-- Actuator可以幫助你監(jiān)控和管理Spring Boot應(yīng)用-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!--熱部署-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
</dependency>
<!--鏈路追蹤-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-sleuth</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zipkin</artifactId>
</dependency>
</dependencies>
<dependencyManagement>
<!--spring cloud依賴版本管理-->
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Greenwich.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<!--編譯插件-->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>11</source>
<target>11</target>
<encoding>utf-8</encoding>
</configuration>
</plugin>
<!--打包插件-->
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
- 創(chuàng)建application.yaml配置文件
server:
port: 9000
eureka:
client:
serviceUrl: # eureka server的路徑
defaultZone: http://LagouCloudEurekaServerA:9300/eureka,http://LagouCloudEurekaServerB:9301/eureka
instance:
prefer-ip-address: true
instance-id: ${spring.cloud.client.ip-address}:${spring.application.name}:${server.port}:@project.version@
spring:
application:
name: lagou-cloud-gateway
#網(wǎng)關(guān)的配置
cloud:
gateway:
routes: #配置路由
- id: service-order-router
#動態(tài)路由:從注冊中心獲取對應(yīng)服務(wù)的實(shí)例
uri: lb://lagou-service-order
predicates:
- Path=/order/**
- id: service-goods-router
uri: lb://lagou-service-goods
predicates:
- Path=/good/**
# filters:
# - StripPrefix=1
- 如果要實(shí)現(xiàn)過濾器功能杭朱,可以繼承Ordered阅仔,GlobalFilter,自定義過濾方法??
Spring Cloud Config分布式配置中心
Server 端:提供配置文件的存儲、以接口的形式將配置文件的內(nèi)容提供出去弧械,通過使用 @EnableConfigServer注解在 Spring boot 應(yīng)用中非常簡單的嵌入
Client 端:通過接口獲取配置數(shù)據(jù)并初始化自己的應(yīng)用
步驟
- 創(chuàng)建github或gitee項(xiàng)目八酒,如lagou-config
- 上傳application.yaml文件
- 創(chuàng)建Config Server項(xiàng)目,導(dǎo)入依賴
<!--eureka client 客戶端依賴引入-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<!--config配置中心服務(wù)端-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
</dependency>
<!--bus 依賴-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>
- 配置啟動類刃唐,使用注解@EnableConfigServer開啟配置中心服務(wù)器功能
- 創(chuàng)建配置文件
server:
port: 9400
#注冊到Eureka服務(wù)中心
eureka:
client:
service-url:
defaultZone: http://LagouCloudEurekaServerA:9300/eureka,http://LagouCloudEurekaServerB:9301/eureka
instance:
prefer-ip-address: true
instance-id: ${spring.cloud.client.ip-address}:${spring.application.name}:${server.port}:@project.version@
spring:
application:
name: lagou-cloud-config
cloud:
config:
server:
#git配置:uri羞迷、用戶名界轩、密碼、分支....
git:
uri: https://gitee.com/rogerjack/lagou-config.git #配置git地址
username: rogerjack
password: 123456
search-paths:
- lagou-config
label: master
rabbitmq:
host: 192.168.64.128
username: roger
password: 123456
#建議暴露所有的端口
management:
endpoints:
web:
exposure:
include: "*"
- 需要獲取配置數(shù)據(jù)的項(xiàng)目都是client,需要引入config client的依賴
<!--spring cloud config client的依賴-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-client</artifactId>
</dependency>
- 把客戶端項(xiàng)目的application配置文件改為bootstrap.yaml文件衔瓮,bootstrap的優(yōu)先級更高浊猾,啟動項(xiàng)目時(shí)會先加載該級別的配置文件,并編寫配置
spring:
cloud:
#config客戶端配置,和ConfigServer通信热鞍,并告知ConfigServer希望獲取的配置信息在哪個(gè)文 件中
config:
name: application
profile:
label: master #分支名稱
uri: http://localhost:9400 #ConfigServer配置中心地址
- 在controller中用@value依賴注入需要的數(shù)據(jù)
- 為了能實(shí)現(xiàn)自動刷新更新的數(shù)據(jù)葫慎,還需要引入rabbitmq的組件??
- 在客戶端和服務(wù)端引入消息總線支持的依賴
<!--bus 依賴-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>
- 在客戶端和服務(wù)端配置
#通知刷新
spring:
rabbitmq:
host: 192.168.64.128
username: rabbitmq的用戶賬號
password: 密碼
- 客戶端需要配置暴露端口
# springboot中暴露健康檢查等斷點(diǎn)接口
management:
endpoints:
web:
exposure:
include: "*"
# 暴露健康接口的細(xì)節(jié)
endpoint
health:
show-details: always
- 當(dāng)git上的數(shù)據(jù)發(fā)生變化后,只需要用POST請求去請求服務(wù)端接口如
http://127.0.0.1:9400/actuator/bus-refresh
??就可以自動刷新所有服務(wù)端數(shù)據(jù)薇宠;如果想單獨(dú)刷新某個(gè)客戶端偷办,可以在接口后面加服務(wù)名:端口號即可,如http://localhost:9006/actuator/bus-refresh/lagou-service-page:9100
使用Nginx實(shí)現(xiàn)GateWay網(wǎng)關(guān)的高可用
- 先配置好單例的網(wǎng)關(guān)項(xiàng)目
- 復(fù)制出另一個(gè)網(wǎng)關(guān)項(xiàng)目澄港,把端口號加一
- 在本地測試需要在host文件配置映射域名爽篷,如
192.168.64.128 www.lagou.com
?? - 再在Nginx的配置文件中配置反向代理
#反向代理配置
#upstream中的server是真正處理請求的應(yīng)用服務(wù)器地址
upstream roger{
#用server定義HTTP地址,注意不能使用localhost或者127.0.0.1慢睡,因?yàn)槭窃谔摂M機(jī)上
server 192.168.0.104:9000;#網(wǎng)關(guān)的ip:host
server 192.168.0.104:9002;#網(wǎng)關(guān)的ip:host
}
server {
listen 80; #這里要用80
server_name www.lagou.com; #host文件中配置的映射域名
location / {
# 利用 proxy_ pass可以將請求代理到upstream命名的HTTP服務(wù)
proxy_pass http://roger; #轉(zhuǎn)發(fā)到的地址
index index.html index.htm;
}
}