SpringBoot&&SpringCloud學(xué)習(xí)筆記

疑問?
既然已經(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 配置中心
image

單例注冊中心

  • 父工程中加入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

使用

  1. 在消費(fèi)者項(xiàng)目的RestTemplate方法上加@loadBalance
  2. 在提供者項(xiàng)目編寫一個(gè)獲取當(dāng)前項(xiàng)目端口的方法喇辽,并且提供者項(xiàng)目做集群。
  3. 在消費(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)用

步驟

  1. 創(chuàng)建github或gitee項(xiàng)目八酒,如lagou-config
  2. 上傳application.yaml文件
  3. 創(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>

  1. 配置啟動類刃唐,使用注解@EnableConfigServer開啟配置中心服務(wù)器功能
  2. 創(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: "*"

  1. 需要獲取配置數(shù)據(jù)的項(xiàng)目都是client,需要引入config client的依賴
<!--spring cloud config client的依賴-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-config-client</artifactId>
        </dependency>

  1. 把客戶端項(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配置中心地址

  1. 在controller中用@value依賴注入需要的數(shù)據(jù)
  • 為了能實(shí)現(xiàn)自動刷新更新的數(shù)據(jù)葫慎,還需要引入rabbitmq的組件??
  1. 在客戶端和服務(wù)端引入消息總線支持的依賴
<!--bus 依賴-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-bus-amqp</artifactId>
        </dependency>

  1. 在客戶端和服務(wù)端配置
#通知刷新
  spring:
      rabbitmq:
        host: 192.168.64.128
        username: rabbitmq的用戶賬號
        password: 密碼

  1. 客戶端需要配置暴露端口
# springboot中暴露健康檢查等斷點(diǎn)接口
management:
  endpoints:
    web:
      exposure:
        include: "*"
  # 暴露健康接口的細(xì)節(jié)
  endpoint
    health:
      show-details: always

  1. 當(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;
        }
    }

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市铡溪,隨后出現(xiàn)的幾起案子漂辐,更是在濱河造成了極大的恐慌,老刑警劉巖棕硫,帶你破解...
    沈念sama閱讀 217,185評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件髓涯,死亡現(xiàn)場離奇詭異,居然都是意外死亡哈扮,警方通過查閱死者的電腦和手機(jī)纬纪,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評論 3 393
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來滑肉,“玉大人包各,你說我怎么就攤上這事“忻恚” “怎么了问畅?”我有些...
    開封第一講書人閱讀 163,524評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長六荒。 經(jīng)常有香客問我护姆,道長,這世上最難降的妖魔是什么掏击? 我笑而不...
    開封第一講書人閱讀 58,339評論 1 293
  • 正文 為了忘掉前任卵皂,我火速辦了婚禮,結(jié)果婚禮上砚亭,老公的妹妹穿的比我還像新娘灯变。我一直安慰自己殴玛,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,387評論 6 391
  • 文/花漫 我一把揭開白布柒凉。 她就那樣靜靜地躺著族阅,像睡著了一般。 火紅的嫁衣襯著肌膚如雪膝捞。 梳的紋絲不亂的頭發(fā)上坦刀,一...
    開封第一講書人閱讀 51,287評論 1 301
  • 那天,我揣著相機(jī)與錄音蔬咬,去河邊找鬼鲤遥。 笑死,一個(gè)胖子當(dāng)著我的面吹牛林艘,可吹牛的內(nèi)容都是我干的盖奈。 我是一名探鬼主播,決...
    沈念sama閱讀 40,130評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼狐援,長吁一口氣:“原來是場噩夢啊……” “哼钢坦!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起啥酱,我...
    開封第一講書人閱讀 38,985評論 0 275
  • 序言:老撾萬榮一對情侶失蹤爹凹,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后镶殷,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體禾酱,經(jīng)...
    沈念sama閱讀 45,420評論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,617評論 3 334
  • 正文 我和宋清朗相戀三年绘趋,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了颤陶。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,779評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡陷遮,死狀恐怖滓走,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情帽馋,我是刑警寧澤闲坎,帶...
    沈念sama閱讀 35,477評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站茬斧,受9級特大地震影響腰懂,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜项秉,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,088評論 3 328
  • 文/蒙蒙 一绣溜、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧娄蔼,春花似錦怖喻、人聲如沸底哗。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,716評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽跋选。三九已至,卻和暖如春哗蜈,著一層夾襖步出監(jiān)牢的瞬間前标,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,857評論 1 269
  • 我被黑心中介騙來泰國打工距潘, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留炼列,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,876評論 2 370
  • 正文 我出身青樓音比,卻偏偏與公主長得像俭尖,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子洞翩,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,700評論 2 354