springBoot+springCloud學習筆記

尊重原創:https://www.jianshu.com/p/492dfefa2735

SpringBoot

配置優先級

  • 在命令行中傳入的參數 如:java -jar storeMs.jar --server.port=8888
  • spring_application_json的屬性
  • java:comp/env中的jndi屬性
  • Java的系統屬性,能夠經過System.getProperties()得到的內容。
  • 操做系統的環境變量
  • 經過random.*配置的隨機屬性
  • 位於當前Jar包以外的 application-{profile}.properties文件
  • 位於當前Jar包以內的 application-{profile}.properties文件
  • 位於當前Jar包以外的 application.properties文件
  • 位於當前Jar包以內的 application.properties文件
  • 在@Configuration註解修改的類中,經過@PropertySource註解定義的屬性。
  • 應用默認屬性 使用SpringApplication.setDefaultProperties定義的內容。
    瞭解springboot的配置加載順序,有助於理解springCloud的遠程配置中心實現的原理。

監控功能

  • 引入actuator依賴
  • 使用相關的端點接口,查看監控的信息
  • 監控的三種類:啓動時系統配置相關、運行時個項功能的性能監控、系統的操做控制。

SpringCloud

Eureka註冊服務中心 三個重要的角色:服務註冊中心、服務提供者、服務消費者。

  • 單點模式 註冊服務中心只有一個。
#指定端口號 server.port=1111 #是否優先使用IP地址做爲主機名的標識 默認爲false eureka.instance.preferIpAddress=true #是否註冊到eureka eureka.client.register-with-eureka=false #是否從eureka獲取註冊信息 eureka.client.fetch-registry=false #eureka服務器的地址(注意:地址最後面的 /eureka/ 這個是固定值) eureka.client.serviceUrl.defaultZone=http://localhost:${server.port}/eureka/ 
  • 高可用模式 服務中心可用將本身做爲服務提供者,註冊到相關的服務中心去。服務中心能夠有多個,集羣的方式。
#application-peer1.properties spring.application.name=eureka-server server.port=1111 eureka.instance.hostname=peer1 eureka.client.serviceUrl.defaultZone=http://peer2:1112/eureka/ #application-peer2.properties spring.application.name=eureka-server server.port=1112 eureka.instance.hostname=peer2 eureka.client.serviceUrl.defaultZone=http://peer1:1111/eureka/ 
  • 在有多個eureka註冊服務的狀況下,服務提供者須要配置全部的eureka中心
eureka.client.serviceUrl.defaultZone=http://peer1:1111/eureka/,http://peer2:1112/eureka/ 
  • 服務提供者 能夠有多個服務提供者 eureka會將全部的相同名稱的服務,作成一個列表的形式,ribbon能夠實現負載均衡 獲取服務。
spring.application.name=hello-service
eureka.client.serviceUrl.defaultZone=http://localhost:1111/eureka/ server.port=8082[8081] 
  • 服務消費者 經過@LoadBalanced來負載均衡
@Bean @LoadBalanced RestTemplate restTemplate() { return RestTemplateMgr.getInstance().init().getTemplate(); } 
  • 服務續約
#發送心跳個server的頻率 默認30秒 eureka.instance.lease-renewal-interval-in-seconds=30 #兩個心跳之間的時間間隔 超過則將服務摘除。 默認90秒 eureka.instance.lease-expiration-duration-in-seconds=90 
  • 其餘的一些配置 如:服務失效剔除、eureka的自我保護、服務下線等。
# 單機調試的時候 能夠關閉保護機制 eureka.server.enable-self-preservation=false 
  • eureka服務的具體配置信息 能夠查看:com.netflix.eureka.EurekaServerConfig 都是以eureka.server開頭。
  • eureka客戶端的具體配置信息 能夠查看:org.springframework.cloud.netflix.eureka.EurekaClientConfigBean 都是以eureka.client開頭。
  • 服務實例類配置信息 能夠查看:org.springframework.cloud.netflix.eureka.EurekaInstanceConfigBean 都是以eureka.instance開頭。

springCloud Ribbon 客戶端負載均衡

  • RibbonEurekaAutoConfiguration 自動配置類
  • 開啓負載均衡的步驟:
  1. 多個服務提供者,註冊到服務中心
  2. 服務消費者經過調用被@LoadBalanced註解修飾過的restTemplate
  • RestTemplate 與 Ribbon整合使用 詳解
  1. RestTemplate 基本使用 GET POST PUT DELETE
  2. RestTemplate 與 Ribbon 整合
  3. 重點源碼:LoadBalancerClient LoadBalancerAutoConfiguration

springCloud Hystrix 服務容錯保護

  • HystrixCommand:用在依賴的服務返回單個操做結果的時候
  • HystrixObservableCommand:用在依賴的服務返回多個操做結果的時候
  • 經過幾個註解的方式能夠簡單使用斷路器的功能
#程序啓動的地方 @EnableCircuitBreaker #具體須要斷路器的服務方法上 @HystrixCommand(fallbackMethod = "helloFallback", commandKey = "helloKey") #斷路器被觸發熔斷的回調方法 public String helloFallback() {} 

springCloud Feign 聲明是服務調用

  • 還沒有仔細看

springCloud Zuul API網關服務

  • Zuul的使用
#在pom.xml引入spring-cloud-starter-zuul #在application.properties配置 spring.application.name=api-gateway server.port=5555 #在啓動類使用@EnableZuulProxy 
  • Zuul的主要功能有:
  1. 請求轉發,即路由的功能;與服務治理框架結合,實現自動化的服務實例維護以及負載均衡的路由轉發。
  2. 請求過濾,便可以當作是權限驗證。權限校驗與微服務業務邏輯解耦。
  3. 它做爲系統的統一入口,屏蔽了系統內部各個服務的細節。
  • 傳統路由方式
zuul.routes.api-a-url.path=/api-a-url/** zuul.routes.api-a-url.url=http://localhost:8001/ 
  • 面向服務的路由 使用eureka服務
zuul.routes.api-a.path=/api-a/** zuul.routes.api-a.serviceId=hello-service zuul.routes.api-b.path=/api-b/** zuul.routes.api-b.serviceId=hello-service zuul.routes.api-c.path=/ddd/** zuul.routes.api-c.serviceId=hello-service eureka.client.serviceUrl.defaultZone=http://localhost:1111/eureka/ 
  • 使用服務名稱的方式 不用eureka服務治理
zuul.routes.api-d.path=/ddd/** zuul.routes.api-d.serviceId=hello ribbon.eureka.enabled=false hello.ribbon.listOfServers=http://localhost:8001/,http://localhost:8002/ 
  • Cookie與頭信息 爲保證請求通過zuul轉發後,還保留有Cookie Heads等信息,須要作一些配置:
#經過設置全局參數爲空來覆蓋默認值 zuul.senstitiveHeaders= #經過制定路由的參數來配置 有以下兩種配置 zuul.routes.<router>.customSensitiveHeaders=true zuul.routes.<router>.senstiveHeaders= 
  • 重定向問題 spring security 和 shiro
zuul.addHostHeader=true 

SpringCloud 的 Brixton會有重定向問題 Camden Dalston 則沒有javascript

  • Hystrix和Ribbon支持 儘可能使用 path與serviceId對應 即便用面向服務的路由。
  • 動態加載/動態路由:原理 將配置放置在git遠程倉庫,更新倉庫的配置文件,調用refresh接口,加載新的配置信息。
# 
  • 動態過濾器:使用groovy實現。

springCloud Sleuth 分佈式服務跟蹤

  • 整合使用
  1. 添加pom.xml的依賴
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-sleuth</artifactId> </dependency> 
  1. 啓動eureka服務
  2. 訪問 查看日誌 分析日誌便可看出鏈路調用的規則。 [trace-1,7cbdce82c9447510,7667724d864b3ec,false]
trace-1:應用名稱 即application.properties中的spring.application.name的值 7cbdce82c9447510:springCloud Sleuth生成的一個ID 稱爲TraceID 用來標識一條請求鏈路 7667724d864b3ec:springCloud Sleuth生成的另一個ID 稱爲SpanID 表示一個基本的工做單元 好比發送一個HTTP請求。 false:表明該信息是否要被後續的跟蹤信息收集器獲取和存儲。 一條請求鏈路中 只能包含一個TraceID 能夠有多SpanID 
  1. 服務跟蹤的實現原理
1.服務框架爲每一個請求建立惟一的跟蹤標識。 通常是在httpHeader裏標識 2.統計各個處理單元的時間耗時。 下一個單元開始 上一個單元結束。 3.源碼跟蹤:org.springframework.cloud.sleuth.Span public static final String SAMPLED_NAME = "X-B3-Sampled"; public static final String PROCESS_ID_NAME = "X-Process-Id"; public static final String PARENT_ID_NAME = "X-B3-ParentSpanId"; public static final String TRACE_ID_NAME = "X-B3-TraceId"; public static final String SPAN_NAME_NAME = "X-Span-Name"; public static final String SPAN_ID_NAME = "X-B3-SpanId"; public static final String SPAN_EXPORT_NAME = "X-Span-Export"; 
  • Sleuth抽樣收集策略
1. 經過Sampler接口實現 默認使用PercentageBasedSampler @Bean public AlwaysSampler defaultSampler() { return new AlwaysSampler(); } 2. 經過配置文件配置 spring.sleuth.sampler.percentage=0.1 #表明獲取10%的樣例 1表明100% 
  • 與Logstash整合 收集日誌分析
  1. ELK平臺 ElasticSearch/Logstash/Kibana這三個工具。
  2. 配置logstash對JSON格式日誌的支持
  • 與Zipkin整合 生產開發中,應該使用這個 附帶有圖形界面查看鏈路調用的服務。
  1. 四大核心組件:
1. Collector:收集器組件,主要處理從外部系統發送過來的信息,將這些信息轉換成Zipkin內部處理的Span格式,以支持後續的存儲、分析、展現等功能。
2. Storage:存儲組件,主要處理收集器收到的信息,默認會將這些信息存儲在內存中。能夠修改存儲的策略,經過使用其餘存儲組件,將跟蹤信息存儲到數據庫中。
3. Restful API:API組件,童工外部訪問接口。
4. WEB UI:UI組件,基於API組件實現的上層應用。方便用戶查詢、分析跟蹤信息。
  1. Sleuth與Zipkin整合 HTTP方式。
1. 搭建ZipKinServer 服務
    <dependencies> <dependency> <groupId>io.zipkin.java</groupId> <artifactId>zipkin-server</artifactId> </dependency> <dependency> <groupId>io.zipkin.java</groupId> <artifactId>zipkin-autoconfigure-ui</artifactId> </dependency> </dependencies> 2. 爲應用引入和配置ZipKin服務 spring.zipkin.base-url=http://localhost:9411 
  1. Sleuth與Zipkin整合 消息中間件收集
1. 爲具體應用添加pom依賴:
    <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-sleuth-stream</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-stream-rabbit</artifactId> </dependency> 2. 配置rabbitmq服務: spring.rabbitmq.host=localhost spring.rabbitmq.port=5672 spring.rabbitmq.username=springcloud spring.rabbitmq.password=123456 3. 修改zipkin-server的pom依賴: <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-sleuth-zipkin-stream</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-stream-rabbit</artifactId> </dependency> <dependency> <groupId>io.zipkin.java</groupId> <artifactId>zipkin-autoconfigure-ui</artifactId> </dependency> 
  • API接口

springboot + elasticsearch全文檢索

  • Elasticsearch與關係型數據庫的比對
Relational DB -> Databases -> Tables -> Rows -> Columns
Elasticsearch -> Indices -> Types -> Documents -> Fields

Elasticsearch集羣能夠包含多個索引(indices)(數據庫) ,每個索引能夠包含多個類型(types)(表) ,每個類型包含多個文檔(documents)(行) ,而後每一個文檔包含多個字段(Fields)(列) 。css

  • DSL查詢(Query DSL) DSL(Domain Specific Language特定領域語言)以JSON請求體的形式出現
  • 高亮(highlight)匹配
  • 短語搜索
  • 全文搜索
  • 分析 聚合 在數據上生成複雜的分析統計

自動配置類

org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchProperties 

框架整合

  • POM.xml的配置
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.2.RELEASE</version> </parent> <!-- 添加 spring-data-elasticsearch的依賴 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-elasticsearch</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> </dependency> <dependency> <groupId>com.sun.jna</groupId> <artifactId>jna</artifactId> <version>3.0.9</version> </dependency> 
  • application.properties
spring.data.elasticsearch.repositories.enabled=true spring.data.elasticsearch.properties.path.logs=./elasticsearch/logs spring.data.elasticsearch.properties.path.data=./elasticsearch/data #獨立服務或者是es集羣的時候打開配置 cluster-name 必須與es配置的name一致 #spring.data.elasticsearch.cluster-name: #默認爲elasticsearch #spring.data.elasticsearch.cluster-nodes: IP:port #配置es節點信息,多個用逗號分隔 
  • 註解說明
  1. @Document
@Persistent @Inherited @Retention(RetentionPolicy.RUNTIME) @Target({ElementType.TYPE}) public @interface Document { String indexName();//索引庫的名稱,通常用項目的名稱命名 String type() default "";////類型,通常用實體的名稱命名 boolean useServerConfiguration() default false; short shards() default 5;//默認分區數 short replicas() default 1;//每一個分區默認的備份數 String refreshInterval() default "1s";//刷新間隔 String indexStoreType() default "fs";//索引文件存儲類型 boolean createIndex() default true; } 
  1. @Field
@Retention(RetentionPolicy.RUNTIME) @Target(ElementType.FIELD) @Documented @Inherited public @interface Field { FieldType type() default FieldType.Auto;//自動檢測屬性的類型 FieldIndex index() default FieldIndex.analyzed;//默認狀況下分詞 DateFormat format() default DateFormat.none; String pattern() default ""; boolean store() default false;//默認狀況下不存儲原文 String searchAnalyzer() default "";//指定字段搜索時使用的分詞器 String analyzer() default "";//指定字段創建索引時指定的分詞器 String[] ignoreFields() default {};//指定須要忽略的字段 boolean includeInParent() default false; } 

springCloud 與 springBoot問題彙總

  • zuul 與 eureka 使用的springCloud版本須要對應上,不然容易引發Ribbon的hystrix熔斷機制。
做者:IT笨男孩 連接:https://www.jianshu.com/p/492dfefa2735 來源:簡書 著做權歸做者全部。商業轉載請聯繫做者得到受權,非商業轉載請註明出處。
相關文章
相關標籤/搜索