㈠ 微服務SpringCloudAlibaba配置匯總
在 pom.xml 中添加 spring-cloud-alibaba-dependencies 統一管理版本:
Nacos 致力於幫助您發現、配置和管理微服務。Nacos 提供了一組簡單易用的特性集,幫助您快速實現動態服務發現、服務配置、服務元數據及流量管理。
通過 @EnableDiscoveryClient 註解表明是一個 Nacos 客戶端,該註解是 Spring Cloud 提供的原生註解
註:server-addr為Nacos Server 網址
Sentinel 以流量為切入點,從流量控制、熔斷降級、系統負載保護等多個維度保護服務的穩定性。
Sentinel 以流量為切入點,從流量控制、熔斷降級、系統負載保護等多個維度保護服務的穩定性。
使用 Spring Cloud Alibaba Nacos Config,您可以在 Nacos Server 集中管理你 Spring Cloud 應用的外部屬性配置。
注意:Spring Boot 配置文件的載入順序,依次為 bootstrap.properties -> bootstrap.yml -> application.properties -> application.yml ,其中 bootstrap.properties 配置為最高優先順序
RocketMQ 是一款開源的分布式消息系統,基於高可用分布式集群技術,提供低延時的、高可靠的消息發布與訂閱服務。
配置 Output(Source.class) 的 Binding 信息並配合 @EnableBinding 註解使其生效
運行成功後即可在 RocketMQ 控制台的 消息 列表中選擇 test-topic 主題即可看到發送的消息
配置 Input(Sink.class) 的 Binding 信息並配合 @EnableBinding 註解使其生效
RPC框架分為提供方和消費方,提供方提供服務,消費方消費服務。這里採用nacos注冊中心和Dubbo框架配置。
㈡ Spring Boot如何整合Redis
Spring Boot是目前非常流行的java Web開發框架,Redis是非關系型資料庫的一種,以鍵值對的形式存儲。Spring對Redis的支持是通過Spring Data Redis來實現的,給我們提供了RedisTemplate和StringRedisTemplate兩種模板來操作數據。Spring Boot框架也提供了對Redis的支持,下面我們來講一下Spring Boot框架整合Redis的步驟。
IntelliJ IDEA
Spring Boot整合Redis我們需要添加依賴的jar包,spring-boot-starter-data-redis中包含spring和redis相關的jar包,jedis作為redis的客戶端也需要添加到工程中,Spring Boot的版本信息在父pom中已指定,子模塊中的spring相關的jar包無需另外指定。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>3.0.0-m1</version>
</dependency>
Spring Boot會根據application.properties中的配置對Redis的屬性進行自動配置,並注入到RedisProperties類中。在application.properties配置文件中這些屬性都是以spring.redis為前綴的,值得注意的是在Spring Boot 1.5.x版本中默認的Redis客戶端是jedis,因此在配置文件中無需指定,如下圖所示。
Spring Boot 1.5.x版本的整合配置網上可以搜索大量的文章,然而Spring Boot 2.x版本的整合資料卻非常少,甚至提供的配置不能正常使用,因此本文主要講解Spring Boot 2.x整合Redis以及Redis的使用情況。spring-boot 2.x版本有jedis和lettuce兩種客戶端,因此我們必須要去指定使用哪一種客戶端,兩個客戶端的配置如下圖所示,本文使用的是Jedis客戶端連接池,具體的配置如下。
# Redis資料庫索引(默認為0)
spring.redis.database=0
# Redis伺服器地址
spring.redis.host=127.0.0.1
# Redis伺服器連接埠
spring.redis.port=6379
# Redis伺服器連接密碼(默認為空)
spring.redis.password=xylx1.t!@#
# 配置jedis連接池
# 連接池最大連接數(使用負值表示沒有限制)
spring.redis.jedis.pool.max-active=8
# 連接池最大阻塞等待時間(使用負值表示沒有限制)
spring.redis.jedis.pool.max-wait=-1ms
# 連接池中的最大空閑連接
spring.redis.jedis.pool.max-idle=8
# 連接池中的最小空閑連接
spring.redis.jedis.pool.min-idle=0
# 連接超時時間(毫秒)
spring.redis.timeout=5000ms
由配置我們可以看到spring-boot 2.x版本時間設置需要加單位ms,因為參數的類型為Duration。另外spring.redis.timeout盡量不要配置0,否則可能會出現io.lettuce.core.RedisCommandTimeoutException: Command timed out超時錯誤。
配置文件編輯完成後,我們開始編寫代碼實現Redis數據的存儲和讀取。我們創建一個RedisUtil工具類,該類使用@Component註解表示交由Spring管理,StringRedisTemplate是Spring提供的,可以使用@Autowired註解直接注入,接下來便可以書寫存和取的代碼了。
@Component
public class RedisUtil {
@Autowired
private StringRedisTemplate redisTemplate;
/**
* 存字元串
* @param key 緩存鍵
* @param value 緩存值
* @param expireTime 過期時間(s)
*/
public void setString(String key, String value, int expireTime){
ValueOperations<String, String> ops = redisTemplate.opsForValue();
if (expireTime != 0) {
ops.set(key, value, expireTime, TimeUnit.SECONDS);
} else {
ops.set(key,value);
}
}
/**
* 取字元串
* @param key 緩存鍵
* @return 緩存值
*/
public String getString(String key){
ValueOperations<String, String> ops = this.redisTemplate.opsForValue();
return ops.get(key);
}
接下來我們編寫Controller層代碼去調用RedisUtil工具類,實現數據的存儲和讀取,代碼比較簡單可以參考下圖。若想驗證Redis是否可用,還需要編寫啟動類,如下圖所示。
由上圖可看到我們編寫了一個post請求用於存儲字元串,get請求用於取出字元串。啟動類通過main方法啟動應用,接下來我們使用postman去模擬瀏覽器調用post和get請求,由下圖可以看到Redis存儲的數據成功被取出。
接下來我們介紹Jedis,這是一個封裝了Redis的客戶端,在Spring Boot整合Redis的基礎上,可以提供更簡單的API操作。因此我們需要配置JedisPool的Bean,代碼如下,其中@Configuration註解表明這是一個配置類,我們在該類中注入RedisProperties,並且使用@Bean註解指定JedisPool。
@Configuration
public class RedisConfiguration {
@Autowired
private RedisProperties properties;
@Bean
public JedisPool getJedisPool(){
JedisPoolConfig config = new JedisPoolConfig();
config.setMaxIdle(properties.getJedis().getPool().getMaxIdle());
config.setMaxTotal(properties.getJedis().getPool().getMaxActive());
config.setMaxWaitMillis(properties.getJedis().getPool().getMaxWait().toMillis());
JedisPool pool = new JedisPool(config,properties.getHost(),
properties.getPort(),100,
properties.getPassword(), properties.getDatabase());
return pool;
}
}
接下來我們編輯JedisUtil工具類,通過SpringBoot容器的@Component註解來自動創建,並且注入JedisPool,使用jedisPool.getResource()方法來獲取Jedis,並最終實現操作redis資料庫,其代碼如下。
@Component
public class JedisUtil {
@Autowired
JedisPool jedisPool;
//獲取key的value值
public String get(String key) {
Jedis jedis = jedisPool.getResource();
String str = "";
try {
str = jedis.get(key);
} finally {
try {
jedis.close();
} catch (Exception e) {
e.printStackTrace();
}
}
return str;
}
public String set(String key, String value) {
Jedis jedis = jedisPool.getResource();
String str = "";
try {
str = jedis.set(key, value);
} finally {
try {
jedis.close();
} catch (Exception e) {
e.printStackTrace();
}
}
return str;
}
}
JedisUtil工具類編寫完成後,我們修改之前的RedisController,並注入JedisUtil,代碼如下圖所示。然後再用postman分別調用post和get介面,我們可以看到成功取到了新的key的value值。
在Spring Boot整合Redis前本機需安裝Redis,另外可以使用RedisDesktopManager這個Redis這個桌面管理工具查看Redis中的數據。
㈢ 6、CXF與spring的整合(WebService的整合)
web.xml
說明: 這里主要配置了 spring 的配置文件地址, spring 監聽器、 CXF 核心控制器。
applicationContext.xml
說明:
在 spring 的配置文件中使用 jaxws:endpoint 元素來暴露 WebService ,這里有兩種方式:
然後我們就可以將工程部署到 tomcat 中,在瀏覽器中使用
地址 http://localhost:8080/cxf_spring/myService 訪問我們的 WebService 工程。
MyClient.java
注意: myService 指定我們的服務名字(在 web.xml 中配置),而 fkjava 指定服務提供者的地址(在 applicationContext.xml 中配置)。同時這種集成不好,因為將地址寫死了,沒有使用 spring 的注入方式。
我們看 HelloWorldWs.java 這個服務類:
可以看到其中的實際業務處理類還是使用的手工方法進行實例化,沒有使用 spring 的注入方式。
在 spring 的配置文件中改變暴露 WebService 的方式:
說明: 加 # 號是為了讓伺服器知道這個名字不是一個類 ,而只是一個 id 。
然後改造 HelloWorldWs.java 服務類:
然後我們再次使用之前的地址進行訪問,發現效果還是一樣的。
在上面配置的基礎上進行添加,在 applicationContext.xml 中:
此時,和以前一樣我們需要在客戶端(工程 Call_CXFSpring )那邊加上攔截器,添加上用戶名和密碼的頭,然後對伺服器進行訪問。以此來進行驗證。客戶端中我們運行類:
MyClient.java
訪問服務端。
傳統的 SSH 項目中,一般在本地是有相關的數據的,但是有一種場景是我們需要調用別人的數據,但是別人的數據不可能讓我們進行修改等操作,那麼別人只會暴露一個 WebService ,而我們就需要去調用別人的 WebService 伺服器。我們在訪問別人時,只能得到 WSDL 文檔。此時我們的項目中就不需要業務邏輯組件了,直接去調用別人的 WebService 的一個代理即可。
首先我們拷貝上面的工程,改名為 cxf_springClient ,然後需要增加 struts2 的相關 jar 包:
將原有的一些包刪掉,留下許可權包 org.fkjava.cxf.ws.auth 。然後我們啟動工程 Auth_Server 提供遠程服務。在 web 工程中生成相應的包及程序。
web.xml
說明: 這里我們不再需要 CXF 的 servlet 了,因為不需要業務類了,我們直接調用遠程業務即可。同時配置 struts2 的核心控制器。
applicationContext.xml
說明: 這里我們同樣不需要業務類了,但是需要配置遠程業務代理類( serviceClass )。同時注意:不要將埠設置為8080,會沖突。可以看到我們使用 serviceClass 將介面配置進去,而這里的 id 不能隨便寫,要和 action 中定義的介面名一致。由於遠程伺服器設置了許可權攔截,所以這里使用過濾器將用戶名和密碼設置到 wsdl 文檔的頭中。然後在這個類中我們需要使用 execute 方法去獲取相應的數據。
struts.xml
ListCatsAction .java
說明: 此時我們就可以使用地址 http://localhost:8080/cxf_springClient/listCats 進行訪問了,當然會報找不到 jsp 的錯誤。
content/listCats.jsp
說明: 此時訪問就可以看到
㈣ 浜屻乻pringboot閰嶇疆鏂囦歡
鍦ㄩ」鐩鐩褰曚笅鍒涘緩涓涓猚onfig鐨勬枃浠跺す錛屽苟鍦ㄤ腑鍒涘緩application.yaml閰嶇疆鏂囦歡錛岀洿鎺ュ湪欏圭洰鐩褰曚笅鍒涘緩application.yaml鏂囦歡銆傚湪resources鐩褰曚笅鍒涘緩config鏂囦歡澶癸紝騫跺壋寤洪厤緗鏂囦歡銆
SpringBoot瀹樻柟鎻愪緵浜嗕袱縐嶅父鐢ㄧ殑閰嶇疆鏂囦歡鏍煎紡錛屽垎鍒鏄痯roperties銆乊ML鏍煎紡銆傜浉姣斾簬properties鏉ヨ達紝YML鏇村姞騫磋交錛屽眰綰т篃鏄鏇村姞鍒嗘槑銆
棣栧厛錛屽湪SpringBoot涓錛屾湁涓ょ嶉厤緗鏂囦歡鐨勬柟寮忋備竴縐嶆槸application.properties錛屽彟涓縐峚pplication.yaml(鎴栬呮槸application.yml)銆
渚濊禆綆$悊錛歋pringBoot鏀鎸佽嚜鍔ㄩ厤緗鍜屼緷璧栫$悊錛岄渶瑕佹敞鎰忓煎叆鐨勪緷璧栨槸鍚︽g『錛屼互閬垮厤鍑虹幇鍐茬獊鎴栫増鏈涓嶅吋瀹圭瓑闂棰樸
榛樿ょ殑閰嶇疆鏂囦歡鏄痑pplication.properties銆
㈤ springboot配置文件總結
springboot 本身支持多種靈活的配置方式,為開發 springboot 程序帶來了很大的靈活性和擴展性,但是同時由於太靈活,經常會導致明明配置了相關屬性,卻沒有生效。
本文總結了 springboot 配置文件的原理以及多個配置文件生效的順序。
springboot 配置文件支持靈活的路徑,以及靈活的文件名,用一個變數表達式總結如下:
部分源碼如下:
當滿足上述變數表達式的配置文件有多個時,會有一個配置的優先順序。假設
上面每個條件組合起來,則最多有配置文件如下,且順序從上到下:
獲取屬性時,按從上到下的順序遍歷由上述文件生成的屬性資源對象 PropertySource ,如果遇到匹配的key直接返回。
總結一下:就是如果同一個key的屬性只出現一次,則直接取該值即可。如果同一個key的屬性出現多次,則取順序靠前的屬性資源對象。另外其中每個文件都是可選的。
需要注意的一點是:如果在同一個 location 下配置了多個文件名一樣的文件,則只會取一個,比如在 classpath:/ ,有如下兩個文件 application.yml :
則只會根據 classloader 的 classpath 列表,選取第一個出現的文件。因為 springboot 載入配置文件時最底層是使用的下面的方法:
這兩個方法只會獲取 classloader 類的 ucp 屬性裡面第一個匹配到的值。如果對 springboot 自身的機制不滿意,想獲取所有的classpath:/路徑下面的 applicaiton.yml 文件,可以使用下面的方法:
本文總結了 springboot 配置文件的原理以及多個配置文件生效的順序。如果存在增加了配置文件或者在配置文件裡面增加了屬性卻沒有生效,可以參考上面的 springboot 配置文件表達式和配置文件生效順序進行排查。
後面還會有一篇文章討論基於 springboot 配置原理如何實現自定義的配置讀取方式。