1、springboot如何設置默認的首頁
1.spring boot中可以設置默認首頁,當輸入域名是可以自動跳轉到默認指定的網頁
@Configuration
public class DefaultView extends WebMvcConfigurerAdapter{
@Override
public void addViewControllers(ViewControllerRegistry registry) {
registry.addViewController("/").setViewName("forward:/index");
registry.setOrder(Ordered.HIGHEST_PRECEDENCE);
super.addViewControllers(registry);
}
}
2、如何配置spring boot內嵌的tomcat8的最大線程數,最大連接數
tomcat最大線程數的設置
Tomcat的server.xml中連接器設置如下
<Connector port="8080"
maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
enableLookups="false" redirectPort="8443" acceptCount="100"
debug="0" connectionTimeout="20000"
disableUploadTimeout="true" />
<Connector port="8080"
maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
enableLookups="false" redirectPort="8443" acceptCount="100"
debug="0" connectionTimeout="20000"
disableUploadTimeout="true" />
tomcat在配置時設置最大線程數,當前線程數超過這個數值時會出錯,那麼有沒有辦法捕獲到這個錯誤,從而在client端顯示出錯信息?
2. 如何加大tomcat連接數
在tomcat配置文件server.xml中的<Connector />配置中,和連接數相關的參數有:
minProcessors:最小空閑連接線程數,用於提高系統處理性能,默認值為10
maxProcessors:最大連接線程數,即:並發處理的最大請求數,默認值為75
acceptCount:允許的最大連接數,應大於等於maxProcessors,默認值為100
enableLookups:是否反查域名,取值為:true或false。為了提高處理能力,應設置為false
connectionTimeout:網路連接超時,單位:毫秒。設置為0表示永不超時,這樣設置有隱患的。通常可設置為30000毫秒。
其中和最大連接數相關的參數為maxProcessors和acceptCount。如果要加大並發連接數,應同時加大這兩個參數。
web server允許的最大連接數還受制於操作系統的內核參數設置,通常Windows是2000個左右,Linux是1000個左右。tomcat5中的配置示例:
<Connector port="8080"
maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
enableLookups="false" redirectPort="8443" acceptCount="100"
debug="0" connectionTimeout="20000"
disableUploadTimeout="true" />
對於其他埠的偵聽配置,以此類推。
3. tomcat中如何禁止列目錄下的文件
在{tomcat_home}/conf/web.xml中,把listings參數設置成false即可,如下:
<init-param>
<param-name>listings</param-name>
<param-value>false</param-value>
</init-param>
<init-param>
<param-name>listings</param-name>
<param-value>false</param-value>
</init-param>
4.如何加大tomcat可以使用的內存
tomcat默認可以使用的內存為128MB,在較大型的應用項目中,這點內存是不夠的,需要調大。
Unix下,在文件{tomcat_home}/bin/catalina.sh的前面,增加如下設置:
JAVA_OPTS='-Xms【初始化內存大小】 -Xmx【可以使用的最大內存】'
需要把這個兩個參數值調大。例如:
JAVA_OPTS='-Xms256m -Xmx512m'
表示初始化內存為256MB,可以使用的最大內存為512MB
3、如何通過域名訪問阿里雲部署的springboot項
1、首先你要有個域名,阿里雲可以買
2、域名需要做解析,解析到你阿里雲的ip上
3、阿里雲控制台的防火牆和阿里雲伺服器(Linux)本身的防火牆都要打開 80 埠
4、springboot項目啟動時設置埠為 80 (獲取通過nginx轉發也可以)
4、spring cloud 本地配置怎麼自動部署
Spring Cloud 習筆記()——入門、特徵、配置
0 放前面
0.1 參考文檔
0.2 maven配置
org.springframework.boot
spring-boot-starter-parent
1.5.2.RELEASE
org.springframework.cloud
spring-cloud-dependencies
Dalston.RELEASE
pom
import
org.springframework.cloud
spring-cloud-starter-config
org.springframework.cloud
spring-cloud-starter-eureka
0.3 簡介
Spring Cloud發員提供快速構建布式系統些通用模式(例配置管理服務發現斷路器智能路由微代理控制匯流排性令牌全局鎖領導選舉布式 群集狀態) 布式系統協調引板模式(boiler plate patterns)並且使用Spring Cloud發員快速實現些模式啟服務應用程序 任何布式環境工作包括發員自筆記本電腦裸機數據受管平台Cloud Foundry
Version: Brixton.SR7
1 特徵
Spring Cloud專注於經典用例擴展機制提供良箱即用
布式/版本配置
服務注冊與發現
路由選擇
服務調用
負載均衡
熔斷機制
全局鎖
領導選舉集群狀態
布式消息
2 原雲應用程序
原雲應用程序發種風格鼓勵持續交付價值驅領域佳實踐
Spring Cloud特性基於Spring Boot更由兩庫實現:Spring Cloud Context and Spring Cloud Commons
2.1 Spring Cloud Context: 應用文服務
Spring Boot關於使用Spring構建應用硬性規定:通用配置文件固定位置通用管理終端監控任務建立基礎Spring Cloud增加些額外特性
2.1.1 引導應用程序文
Spring Cloud創建bootstrap文主應用程序父文應配置文件擁高優先順序並且默認能本配置文件覆蓋應文件名bootstrap.yml或bootstrap.properties
通設置spring.cloud.bootstrap.enabled=false禁止bootstrap進程
2.1.2 應用文層級結構
用SpringApplication或SpringApplicationBuilder創建應用程序文bootstrap文作父文添加進文繼承父文屬性
文配置信息覆蓋父文配置信息
2.1.3 修改Bootstrap配置文件位置
spring.cloud.bootstrap.name(默認bootstrap)或者spring.cloud.bootstrap.location(默認空)
2.1.4 覆蓋遠程配置文件值
spring.cloud.config.allowOverride=true
spring.cloud.config.overrideNone=true
spring.cloud.config.overrideSystemProperties=false
2.1.5 定製Bootstrap配置
/META-INF/spring.factorieskeyorg.springframework.cloud.bootstrap.BootstrapConfiguration定義Bootstrap啟組件
主應用程序啟前始Bootstrap文創建spring.factories文件組件@Beans類型bean
2.1.6 定製Bootstrap屬性源
關鍵點:spring.factories、PropertySourceLocator
2.1.7 環境改變
應用程序通EnvironmentChangedEvent監聽應用程序並做響應
2.1.8 Refresh Scope
Springbean@RefreshScope做特殊處理用於刷新bean配置信息
注意
需要添加依賴org.springframework.boot.spring-boot-starter-actuator
目前我@Controller測試功
需要自發送POST請求/refresh
修改配置文件即
2.1.9 加密解密
Spring Cloud配置文件值進行加密
"Illegal key size"異需要安裝JCE
2.1.10 服務點
除Spring Boot提供服務點Spring Cloud提供些服務點用於管理注意都POST請求
/env:更新Environment、重新綁定@ConfigurationProperties跟志級別
/refresh重新載入配置文件刷新標記@RefreshScopebean
/restart重啟應用默認用
命周期:/pause、/resume
2.2 Spring Cloud Commons:通用抽象
服務發現、負載均衡、熔斷機制種模式Spring Cloud客戶端提供通用抽象層
2.2.1 RestTemplate作負載均衡客戶端
通@Bean跟@LoadBalanced指定RestTemplate注意URI需要使用虛擬域名(服務名能用域名)
:
@Configuration
public class MyConfiguration {
@LoadBalanced
@Bean
RestTemplate restTemplate() {
return new RestTemplate();
}
}
public class MyClass {
@Autowired
private RestTemplate restTemplate;
public String doOtherStuff() {
String results = restTemplate.getForObject("", String.class);
return results;
}
}
2.2.2 RestTemplate象
注意@Primary註解使用
@Configuration
public class MyConfiguration {
@LoadBalanced
@Bean
RestTemplate loadBalanced() {
return new RestTemplate();
}
@Primary
@Bean
RestTemplate restTemplate() {
return new RestTemplate();
}
}
public class MyClass {
@Autowired
private RestTemplate restTemplate;
@Autowired
@LoadBalanced
private RestTemplate loadBalanced;
public String doOtherStuff() {
return loadBalanced.getForObject("", String.class);
}
public String doStuff() {
return restTemplate.getForObject("", String.class);
}
}
2.2.3 忽略網路介面
忽略確定名字服務發現注冊支持則表達式配置
3 Spring Cloud Config
Spring Cloud Config提供服務端客戶端布式系統擴展配置支持同環境配置(發、測試、產)使用Git做默認配置端支持配置環境打版本標簽
3.1 快速始
通IDE運行或maven運行
默認載入property資源策略克隆git倉庫(at spring.cloud.config.server.git.uri')
HTTP服務資源構:
/{application}/{profile}[/{label}]
/{application}-{profile}.yml
/{label}/{application}-{profile}.yml
/{application}-{profile}.properties
/{label}/{application}-{profile}.properties
.config.name,(般說'application'規Spring Boot應用),profileactiveprofile(或者逗號隔屬性列表),label選git標簽(默認"master")
3.1.1 客戶端示例
創建Spring Boot應用即添加依賴org.springframework.cloud:spring-cloud-starter-config
配置application.properties注意URL配置服務端址
spring.cloud.config.uri:
3.2 Spring Cloud Config 服務端
針系統外配置項(name-value或相同功能YAML內容),該伺服器提供基於資源HTTP介面使用@EnableConfigServer註解,該伺服器容易嵌入Spring Boot 系統使用該註解該應用系統配置伺服器
@SpringBootApplication
@EnableConfigServer
public class ConfigApplicion {
public static void main(String[] args) throws Exception {
SpringApplication.run(ConfigApplicion.class, args);
}
}
3.2.1 資源庫環境
{application} 應客戶端"spring.application.name"屬性
{profile} 應客戶端 "spring.profiles.active"屬性(逗號隔列表)
{label} 應服務端屬性,屬性能標示組配置文件版本
配置庫基於文件伺服器application.ymlfoo.yml創建Environment象高優先順序配置優先轉Environment象PropertySource
3.2.1.1 Git端
默認EnvironmentRepository用Git端進行實現Git端於管理升級物理環境便,審計配置變更便file:前綴本配置庫讀取數據
配置庫實現通映射HTTP資源{label}參數作git label(提交id,支名稱或tag)git支或tag名稱包含斜杠 ("/"),HTTP URLlabel需要使用特殊字元串"(_)"替代(避免與其URL路徑相互混淆)使用命令行客戶端 curl請謹慎處理URL括弧(例:shell請使用引號''轉義)
Git URI佔位符
Spring Cloud Config Server支持git庫URL包含針{application} {profile}佔位符(需要,{label}包含佔位符, 要牢記任何情況label指gitlabel)所容易支持應用系統配置庫策略或profile配置庫策略
模式匹配資源庫
spring:
cloud:
config:
server:
git:
uri:
repos:
simple:
special:
pattern: special*/dev*,*special*/dev*
uri:
local:
pattern: local*
uri: file:/home/configsvc/config-repo
{application}/{profile}能匹配任何錶達式使用spring.cloud.config.server.git.uri應值例於 "simple" 配置庫, 匹配模式simple/* (說,論profile匹配application名稱simple應用系統)local庫匹配所application名稱local任何應用系統管profiles(實現覆蓋沒配置profile匹配規則/*綴自增加任何匹配表達式)
Git搜索路徑佔位符
spring.cloud.config.server.git.searchPaths
3.2.1.2 版本控制端文件系統使用
伴隨著版本控制系統作端(git、svn)文件都check out或clone 本文件系統默認些文件放置config-repo-前綴系統臨目錄Linux譬應該/tmp/config-repo-目錄些操作系統routinely clean out放臨目錄導致預知問題現避免問題通設置spring.cloud.config.server.git.basedir或spring.cloud.config.server.svn.basedir參數值非系統臨目錄
3.2.1.3 文件系統端
使用本載入配置文件
需要配置:spring.cloud.config.server.native.searchLocations跟spring.profiles.active=native
路徑配置格式:classpath:/, classpath:/config,file:./, file:./config
3.2.1.4 共享配置給所應用
基於文件資源庫
基於文件資源庫(i.e. git, svn and native)文件名application*命名資源所客戶端都共享( application.properties, application.yml, application-*.properties,etc.)
屬性覆蓋
spring.cloud.config.server.overrides添加Map類型name-value實現覆蓋
例
spring:
cloud:
config:
server:
overrides:
foo: bar
使所配置客戶端應用程序讀取foo=bar自配置參數
3.2.2 健康指示器
通指示器能夠檢查已經配置EnvironmentRepository否運行
通設置spring.cloud.config.server.health.enabled=false參數禁用健康指示器
3.2.3 安全
自由選擇任何覺合理式保護Config Server(物理網路安全OAuth2 令牌)同使用Spring SecuritySpring Boot 能使做更其用事情
使用默認Spring Boot HTTP Basic 安全需要Spring Security 增加classpath(org.springframework.boot.spring-boot-starter-security)默認用戶名user應隨機密碼種情況實際使用並沒意義般建議配置密碼(通 security.user.password屬性進行配置)並密碼進行加密
3.2.4 加密與解密
遠程屬性包含加密內容({cipher}),些值通HTTP傳遞客戶端前解密
使用略
3.2.5 密鑰管理
配置服務使用稱(共享)密鑰或者非稱密鑰(RSA密鑰)
使用略
3.2.6 創建測試密鑰庫
3.2.7 使用密鑰循環密鑰
3.2.8 加密屬性服務
3.3 替換格式服務
配置文件加綴".yml"、".yaml"、".properties"
3.4 文本解釋服務
/{name}/{profile}/{label}/{path}
3.5 嵌入配置伺服器
般配置服務運行單獨應用面要使用註解@EnableConfigServer即嵌入其應用
3.6 推送通知匯流排
添加依賴spring-cloud-config-monitor激Spring Cloud 匯流排/monitor端點即用
webhook激針應用程序能已經變化配置服務端發送RefreshRemoteApplicationEvent
3.7 客戶端配置
3.7.1 配置第引導
通spring.cloud.config.uri屬性配置Config Server址
3.7.2 發現第引導
用Netflix則用eureka.client.serviceUrl.defaultZone進行配置
3.7.3 配置客戶端快速失敗
些例面能希望沒連接配置服務端直接啟失敗通spring.cloud.config.failFast=true進行配置
3.7.4 配置客戶端重試
添加依賴spring-retry、spring-boot-starter-aop設置spring.cloud.config.failFast=true默認6重試初始補償間隔1000ms續補償1.1指數乘數通spring.cloud.config.retry.*配置進行修改
3.7.5 定位遠程配置資源
路徑:/{name}/{profile}/{label}
"name" = ${spring.application.name}
"profile" = ${spring.profiles.active} (actually Environment.getActiveProfiles())
"label" = "master"
label於滾前版本用
3.7.6 安全
通spring.cloud.config.password、spring.cloud.config.username進行配置
5、springboot接收請求重定向指定url
你好,解決方法如下: 可以通過實現介面來實現: public class Application extends SpringBootServletInitializer implements { @Override protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) { return builder.sources(Application.class); } public static void main(String[] args) { SpringApplication.run(Application.class, args); } @Override public void customize( container) { container.setPort(8081); }
6、springboot部署到伺服器找不到controller
那應該是伺服器端的抄Nginx沒有配置,需要增加映射按一下流程篩查:
域名解析ip正確 - 訪問 -> 伺服器 - Nginx - 配置根據域名找到springboot項目,並確保Nginx和springboot項目已啟動。
7、為什麼選擇Spring Boot作為微服務的入門級微框架
1. Spring Boot是什麼,解決哪些問題
1) Spring Boot使編碼變簡單
2) Spring Boot使配置變簡單
3) Spring Boot使部署變簡單
4) Spring Boot使監控變簡單
5) Spring Boot的不足
2. Spring Boot在平台中的定位,相關技術如何融合
1) SpringBoot與SEDA +MicroService + RESTful
2) SpringBoot與Mock
3. 採用了SpringBoot之後,技術管理應該如何進行
首先,我們來看一下spring boot是什麼,它幫助我們解決了哪些問題:
SpringBoot是伴隨著Spring4.0誕生的;
從字面理解,Boot是引導的意思,因此SpringBoot幫助開發者快速搭建Spring框架;
SpringBoot幫助開發者快速啟動一個Web容器;
SpringBoot繼承了原有Spring框架的優秀基因;
SpringBoot簡化了使用Spring的過程。
Spring由於其繁瑣的配置,一度被人認為「配置地獄」,各種XML、Annotation配置,讓人眼花繚亂,而且如果出錯了也很難找出原因。
Spring Boot更多的是採用Java Config的方式,對Spring進行配置。
可以看到,採用了spring-boot-start-actuator之後,直接以REST的方式,獲取進程的運行期性能參數。
當然這些metrics有些是有敏感數據的,spring-boot-start-actuator為此提供了一些Basic Authentication認證的方案,這些方案在實際應用過程中也是不足的。
Spring Boot作為一個微框架,離微服務的實現還是有距離的。
沒有提供相應的服務發現和注冊的配套功能,自身的acturator所提供的監控功能,也需要與現有的監控對接。沒有配套的安全管控方案,對於REST的落地,還需要自行結合實際進行URI的規范化工作。
下面,我們研究一下Spring Boot在平台中的定位,相關技術如何融合。
上圖比較復雜,整體是採用SEDA,也就是Stage-EDA。可以看到,整體是以處理順序進行展示的,響應過程類似。在處理過程中,主要會有前置過濾,核心功能處理,後置過濾幾大部分。
圖中的過濾器都是可插拔式的,並且可以根據實際場景進行擴展開發。每個過濾器都是Stage,比如ClientInstance合法性檢查、調用鑒權、解密、限流等等。
一個請求Stage與Stage的轉換,實現上是切換不同的線程池,並以EDA的方式驅動。
對於業務邏輯的開發者而言,只需要關心CORE部分的業務邏輯實現,其他的非功能都由框架進行統一實現。
Mock不應當再是測試的專有名詞了,當然對於測試這個角色而言,mockito這樣的工具,依然可以為他們提升不少效率。
SpringBoot為創建REST服務提供了簡便的途徑,相比之下,採用阿里的bbo在做多團隊、多進程聯調時,mock的難度就陡增。
Mock是解耦並行開發的利器,在理性的情況下,軟體從開發期Mock聯調,到開發與開發的真實聯調,只需要切換一個依賴的域名即可,比如:
mockURI:http://mock.service.net/v1/function?param1=value1
devURI:http://dev.service.net/v1/function?param1=value1
而上述的域名切換,只需要在開發期定義好一個配置項,在做環境切換的時候自動注入即可,省時、省心、省力。
如上圖和docker的集成可以有AB兩種方案:
? A方案的核心是,把docker作為操作系統環境的交付基線,也就是不同的fat jar 使用相同的操作系統版本、相同的JVM環境。但對於docker image來說都是一樣的。
? B方案的核心是,不同的fat jar,獨立的編譯為docker image,在啟動時直接啟動帶有特定版本的image。
A相比與B方案的特點是對於docker registry(也就是docker的鏡像倉庫)的依賴性較低,對於前期編譯過程的要求也較低。
採用了Spring Boot之後,技術管理應該如何進行?
正因為Spring Boot是與Spring一脈相承的,所以對於廣大的Java開發者而言,對於Spring的學習成本幾乎為零。
在實踐Spring Boot時學習重點,或者說思維方式改變的重點在於:
1)對於REST的理解,這一點尤為重要,需要從設計、開發多個角色達成共識,很多時候都是對於HTTP 1.1協議以及REST的精髓不理解,導致REST被「盲用」而產生一些不好的效果。
2)對於YAML的理解和對於JavaConfig的理解,這兩點相對較為簡單,本質上是簡化了xml文件,並提供等價的配置表述能力。
1. 豐富的工具鏈為SpringBoot的推廣帶來了利好。
2. SpringBoot的工具鏈主要來自於兩個方面:
1) 原有Spring積累的工具鏈;
2) SpringMVC或者其他REST框架使用HTTP協議,使得HTTP豐富的工具成為SpringBoot天然的資源。
SpringBoot自身對於前面提到的配置文件:「application.yml」提供了多個「Profile」,可以便於開發者描述不同環境的配置,這些配置例如資料庫的連接地址、用戶名和密碼。
但是對於企業用戶而言,把不同環境的配置,寫到同一個配置文件中,是極其不安全的,是一個非常危險的動作。
有一個經常被提及的例子是,隨著開源的進行,很多互聯網公司,都由於把相關的代碼提交到github之類的開源代碼社區,並且沒有對代碼進行嚴格的配置審查,導致一些」password」被公開。有些不良用心的人,就利用搜索工具,專門去挖掘這些關鍵字,進而導致資料庫被「拖庫」。
所以對於企業用戶,更多的應該是採用集中式的配置管理系統,將不同環境的配置嚴格區分地存放。
雖然SpringBoot的actuator自身提供了基於「用戶名+口令」的最簡單的認證方式,但它保護的是對框架自身運行期的性能指標敏感數據的最基本的保護。這種保護在實際應用過程中,「用戶名+口令」的管理是缺乏的,「用戶名+口令」的安全配置過程是缺失的。
SpringBoot也不提供對於我們自己開發的功能的任何防護功能。
一般來講,一個安全的信道(信息傳輸的通道),需要通信雙方在進行正式的信息傳輸之前對對方進行身份認證,服務提供方還需要在此基礎之上,對請求方的請求進行許可權的校驗,以確保業務安全。這些內容也需要基於SpringBoot進行外圍的安全擴展,例如採用前面提到的S-EDA進行進程級別的安全管控。這些還需要配套的安全服務提供支持。
一般來說,只要企業與互聯網對接,那麼隨便一個面向消費者的「市場活動」,就有可能為企業帶來井噴的流量。
傳統企業內,更多的系統是管理信息類的支撐系統,這類系統在設計時的主要用戶是企業內部員工以及有限的外部供應商。這類系統存在於企業內部的時間一直很長,功能耦合也很多,在功能解耦前,是非常不適合的,或者說絕對不可以直接為互聯網的用戶進行服務的。
SpringBoot自身並沒有提供這樣的流控措施,所以需要結合前面提到的S-EDA進行流量的控制,並結合下層的水平擴展能力(例如,Kubernets)進行流量負載合理的動態擴容。
另外,在長業務流程的設計上,也盡可能地採用非同步的方式,比如介面調用返回的是一個「受理號」,而不是業務的處理結果,避免井噴業務到來時,同步調用所帶來的阻塞導致系統迅速崩潰,這些也都是SpringBoot自身並不解決的問題。
下面我們總結一下:
8、springboot 綁定域名
spring boot把他看作服務容器.前端再加一個apache服務或者nginx伺服器做內容分發,分發到不同的app 容器上,就類似於tomcat配置虛擬主機一樣
9、如何在Ubuntu 14.04伺服器上自動化部署Spring Boot的應用
1. 在Ubuntu中安裝Java8
以下是一個簡單的安裝方法。
$ sudo add-apt-repository ppa:webupd8team/java
$ sudo apt-get update
$ sudo apt-get install oracle-java8-installer
$ java -version
java version "1.8.0_60"
Java(TM) SE Runtime Environment (build 1.8.0_60-b27)
Java HotSpot(TM) 64-Bit Server VM (build 25.60-b23, mixed mode)
2. 本地使用Gradle發布Spring Boot應用
我這里使用Jetty9作為內置的伺服器。
// ...
bootRun {
systemProperties = System.properties
}
configurations {
compile.exclude mole: "spring-boot-starter-tomcat"
}
dependencies {
// spring boot
compile "org.springframework.boot:spring-boot-starter-web:1.3.0.M5"
compile "org.springframework.boot:spring-boot-starter-jetty"
// ...
}
//...
在本地運行默認使用 src/main/resources/application.yml
作為配置文件,而在proction環境中我們系統它支持提供外部的配置文件 application-proction.yml
。
./gradlew bootRun # 開發環境下默認使用項目里的application.yml
# 在本地測試使用外部配置文件
./gradlew bootRun -Dspring.config.location=/path/to/application-proction.yml
# 發布
./gradlew build
# 運行
java -jar build/libs/SpringBlog-0.1.jar # 默認使用jar包裡面的application.yml配置文件
# 使用外部配置文件
java -jar build/libs/SpringBlog-0.1.jar --spring.config.location=/path/to/application-proction.yml
3. 在Ubuntu伺服器上部署Spring Boot應用
# 上傳SpringBlog-0.1.jar到伺服器
scp build/libs/SpringBlog-0.1.jar root@your_server_ip:/root/spring-blog/current
# 在伺服器上配置生產環境的配置文件
scp application-proction.yml root@your_server_ip:/root/spring-blog/current
然後 SSH
登錄伺服器,修改配置文件 application-proction.yml
,試運行應用。
ssh root@your_server_ip
cd spring-blog/current
java -jar SpringBlog-0.1.jar --spring.config.location=application-proction.yml
# application-proction.yml
server:
address: raysmond.com # 使用域名或者IP,啟動之後就可以這個域名或IP訪問網站了
port: 80
contextPath:
spring:
profiles:
active: proction
thymeleaf:
cache: true
jade4j:
caching: true
dataSource:
driverClassName: com.mysql.jdbc.Driver
url: jdbc:mysql://127.0.0.1/spring_blog
username: root
password:
hibernate:
dialect: org.hibernate.dialect.MySQLDialect
hbm2ddl.auto: update
show_sql: false
redis:
host: localhost
port: 6379
4. 如何在Ubuntu中後台運行Spring Boot應用?
推薦使用 nohup
這個命令。
cd /root/spring-blog/current
nohup java -jar SpringBlog-0.1.jar --spring.config.location=application-proction.yml \
> ../logs/proction.log 2> ../logs/proction.err &
在Ubuntu還可以 /etc/init.d
目錄下新建一個腳本,把SpringBlog作為service來運行,這樣不用每次都打這么繁瑣的命令了。新建一個 /etc/init.d/spring_blog
文件,內容如下:
#!/bin/sh
SERVICE_NAME=spring_blog
HOME=/root/spring-blog
PATH_TO_JAR=$HOME/current/SpringBlog-0.1.jar
PID_PATH_NAME=/tmp/spring_blog.pid
LOG=$HOME/logs/proction.log
ERROR_LOG=$HOME/logs/proction.err
CONFIG=$HOME/application-proction.yml
case $1 in
start)
echo "Starting $SERVICE_NAME ..."
if [ ! -f $PID_PATH_NAME ]; then
cd $HOME/current
nohup java -jar $PATH_TO_JAR --spring.config.location=application-proction.yml > $LOG 2> $ERROR_LOG &
echo $! > $PID_PATH_NAME
echo "$SERVICE_NAME started ..."
else
echo "$SERVICE_NAME is already running ..."
fi
;;
stop)
if [ -f $PID_PATH_NAME ]; then
PID=$(cat $PID_PATH_NAME);
echo "$SERVICE_NAME stoping ..."
kill $PID;
echo "$SERVICE_NAME stopped ..."
rm $PID_PATH_NAME
else
echo "$SERVICE_NAME is not running ..."
fi
;;
restart)
if [ -f $PID_PATH_NAME ]; then
PID=$(cat $PID_PATH_NAME);
echo "$SERVICE_NAME stopping ...";
kill $PID;
echo "$SERVICE_NAME stopped ...";
rm $PID_PATH_NAME
echo "$SERVICE_NAME starting ..."
cd $HOME/current
nohup java -jar $PATH_TO_JAR --spring.config.location=application-proction.yml > $LOG 2> $ERROR_LOG &
echo $! > $PID_PATH_NAME
echo "$SERVICE_NAME started ..."
else
echo "$SERVICE_NAME is not running ..."
fi
;;
esac
現在就可以使用service的方式來運行網站了。
sudo service spring_blog start
sudo service spring_blog stop
sudo service spring_blog restart
5. 在本地自動化部署網站到遠程伺服器
在本地我用了一個shell腳本和一個python腳本來配合自動化部署。
deploy.sh
使用 gradle
的命令發布jar包,使用 scp
命令吧jar包上傳到伺服器上;
deploy.py
使用 SSH
遠程登錄伺服器,並在伺服器上執行部署命令。
# deploy.sh
#!/bin/bash
SERVER="your_server_ip"
JAR="build/libs/SpringBlog-0.1.jar"
echo "Building $JAR..."
./gradlew build
echo "Upload $JAR to server $SERVER..."
scp $JAR root@$SERVER:/root/spring-blog/
python deploy.py
deploy.py
主要使用了一個 paramiko
庫,用於 SSH
遠程登錄伺服器,並執行命令。這個腳本會把伺服器上 /root/spring-blog/current/SpringBlog-0.1.jar
備份到 /root/spring-blog/releases
中,並把新發布的jar包放到 /root/spring-blog/current
中,然後重啟 spring_blog
服務。
#!/usr/bin/python
import paramiko
import threading
import time
ip = 'your_server_ip'
user = 'root'
password = ''
jar = 'SpringBlog-0.1.jar'
home='/root/spring-blog'
current=home+"/current"
releases=home+"/releases"
def execute_cmds(ip, user, passwd, cmd):
try:
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(ip,22,user,passwd,timeout=5)
for m in cmd:
print m
stdin, stdout, stderr = ssh.exec_command(m)
# stdin.write("Y")
out = stdout.readlines()
for o in out:
print o,
print '%s\tOK\n'%(ip)
ssh.close()
except :
print '%s\tError\n'%(ip)
if __name__=='__main__':
print 'Start deploying %s to server %s'%(jar, ip)
now = time.strftime("%Y%m%d%H%M%S")
cmd = [
'echo Stop spring_blog service... && service spring_blog stop',
'echo Flush all redis cache data... && redis-cli -r 1 flushall',
'echo Stop redis server... && service redis_6379 stop',
'echo Use new jar... ' + \
' && mv ' + current + '/' + jar + ' ' + releases + '/' + now + '_' + jar ,
'mv ' + home + '/' + jar + ' ' + current + '/' + jar,
'echo Stop redis... && service redis_6379 start',
'echo Start spring_blog service... && service spring_blog start ' + \
' && echo All done.'
]
a=threading.Thread(target=execute_cmds, args=(ip,user,password,cmd))
a.start()
配置完以後,在本地寫完代碼就可以運行 ./deploy.sh
一鍵部署到遠程伺服器了。
10、新手,springBoot項目寫完之後,別人怎麼通過http的網址訪問到我的網址,也就是如何上線,網址已經購買好了?
將項目打包發布到伺服器就可以了啊