基於maven
打包方式通常採用的jar包,使用springboot的默認方式便可;java
使用maven命令:web
mvn clean package -Dmaven.test.skip=true
執行成功以後,能夠在對應的target目錄下找到對應的包,好比: eg-zuul-0.0.1-SNAPSHOT.jar spring
springboot內置了web container容器 tomcat, 能夠直接使用 java -jar命令運行;shell
例如:apache
java -jar xxx/target/eg-zuul-0.0.1-SNAPSHOT.jar
也可以使用war的方式,使用外置的tomcat運行,不過代碼須要改造一下:
1 改造打包方式
打包方式改成 war包;
在pom.xml中,在version標籤的下面添加配置:segmentfault
<package>war</package>
2 添加改造啓動代碼 api
package com.springbootpractice.egzuul; import org.springframework.boot.builder.SpringApplicationBuilder; import org.springframework.boot.web.servlet.support.SpringBootServletInitializer; /** * @author <a href="mailto:505847426@qq.com">carterbrother</a> * @description 經過外置的容器運行springboot * @date 2019年06月21日 15:32 * @Copyright (c) carterbrother */ public class ServletInitializer extends SpringBootServletInitializer { @Override protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) { return builder.sources(EgZuulApplication.class); } }
原理是: 從servlet3.1開始,運行無web.xml的web程序,只須要實現ServletContainerInitializer接口,而SpringBootServletInitializer擴展了該類,因此能夠實現無xml啓動;tomcat
3 配置外置tomcat springboot
4 忽略打包檢查網絡
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-war-plugin</artifactId> <version>2.3</version> <configuration> <failOnMissingWebXml>false</failOnMissingWebXml> </configuration> </plugin>
開發的時候用到, spring-boot-devtools ;
引入依賴:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <optional>true</optional> </dependency>
暴露的配置信息能夠配置更多細節方面的處理:
基於junit 和 mockito (消除各類環境對於http帶來的困難)
package com.springbootpractice.eguser; import com.springbootpractice.api.user.dto.UserPro; import com.springbootpractice.eguser.service.UserService; import org.junit.Assert; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.web.client.TestRestTemplate; import org.springframework.test.context.junit4.SpringRunner; import java.util.Map; @RunWith(SpringRunner.class) @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) public class EgUserApplicationTests { @Autowired private UserService userService; @Autowired private TestRestTemplate testRestTemplate; @Test public void testUserService() { UserPro userPro = new UserPro(); userPro.setId(1L); userPro.setUserName("xxxaaa"); final Map<String, Object> map = userService.insertUser(userPro); Assert.assertEquals("插入失敗",true,map.get("success")); final UserPro userProReturn = userService.getUserPro(1L); Assert.assertEquals(userPro,userProReturn); } @Test public void testUserRest() { UserPro userPro = new UserPro(); userPro.setId(2L); userPro.setUserName("BBBB"); Map map = testRestTemplate.postForObject("/insert", userPro, Map.class); Assert.assertEquals("插入失敗",true,map.get("success")); UserPro userProReturn = testRestTemplate.getForObject("/user/{id}", UserPro.class, 2L); Assert.assertEquals(userPro,userProReturn); } }
當依賴的服務尚未開發完畢,而須要測試的功能卻強烈依賴,可使用Mock來測試;
package com.springbootpractice.egproduct; import com.springbootpractice.api.user.UserApi; import com.springbootpractice.api.user.dto.UserPro; import org.junit.Assert; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.BDDMockito; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.test.context.junit4.SpringRunner; @RunWith(SpringRunner.class) @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) public class EgProductApplicationTests { @MockBean private UserApi userApi; @Test public void mockUserApiTest() { UserPro mockUserPro = new UserPro(); mockUserPro.setId(1L); mockUserPro.setUserName("xxxx"); BDDMockito.given(userApi.getUserPro(1L)).willReturn(mockUserPro); UserPro userProReturn = userApi.getUserPro(1L); Assert.assertEquals(userProReturn,mockUserPro); } }
基於 actuator ,監控運行狀態,進行一些簡單的管理
引入依賴:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> <dependency> <groupId>org.springframework.hateoas</groupId> <artifactId>spring-hateoas</artifactId> <version>0.24.0.RELEASE</version> </dependency>
默認只開放了 health , info ;
若是要開放全部的監控點:
management.endpoint.web.exposure.include=*
常見的監控點有:
url | 監控說明 |
---|---|
health | 監控信息 |
info | |
beans | 容器中的Bean |
mappings | url mapping |
env | 配置參數 |
shutdown | 關閉服務 |
conditions | 自動裝配相關的信息 |
對敏感的配置信息,可使用spring-security來控制保護起來;
shutdown端點默認是關閉的,開啓的配置屬性是:
management.endpoint.shutdown.enabled=true
開啓以後 訪問 /actuator/shutdown 須要是post請求才能調用;
通常的配置端點開關的方式是:
//默認全部的端點都是關閉的,而後選擇一些須要暴露的端點進行打開
management.endpoints.enabled-by-default=false
標註@Endpoint註解類,
@ReadOperation標註方法 標識GET方法
@WriteOperation 標識POST方法
@DeleteOperation 標識Delete方法
package com.springbootpractice.egproduct.endpoint; import org.springframework.boot.actuate.endpoint.annotation.Endpoint; import org.springframework.boot.actuate.endpoint.annotation.ReadOperation; import org.springframework.stereotype.Component; /** * @author <a href="mailto:505847426@qq.com">carterbrother</a> * @description 新增actuator的一個端點 * @date 2019年06月21日 18:42 * @Copyright (c) carterbrother */ @Endpoint(id = "dbCheck",enableByDefault = true) @Component public class DBCheckEndpoint { @ReadOperation public String test(){ return "db check ok"; } }
actuator內置了不少的健康指標 須要配置才能顯示,配置方法:
management.endpoint.health.show-details=_always_
package com.springbootpractice.egproduct.health; import org.springframework.boot.actuate.health.AbstractHealthIndicator; import org.springframework.boot.actuate.health.Health; import org.springframework.stereotype.Component; import java.io.IOException; import java.net.InetAddress; /** * @author <a href="mailto:505847426@qq.com">carterbrother</a> * @description 進行網絡檢查 * @date 2019年06月21日 18:30 * @Copyright (c) carterbrother */ @Component public class WWWHealthIndicator extends AbstractHealthIndicator { @Override protected void doHealthCheck(Health.Builder builder) throws Exception { if (ping()){ builder.withDetail("message","能夠正常鏈接互聯網").up(); return; } builder.withDetail("message","沒法鏈接互聯網").unknown(); } private boolean ping() { try { return InetAddress.getByName("www.baidu.com").isReachable(3000); } catch (IOException e) { return false; } } }
相對於http監控,也提供了jmx的監控方式;
典型使用方式使用的是jdk的 jconsole,使用jmx協議鏈接本地的jvm,進行監控,MBean下的Health下能夠查看到返回信息;以此來進行監控。
原創不易,轉載請註明出處,歡迎溝通交流。