0109 springboot的部署測試監控

springboot的部署測試監控

部署

基於mavenjava

打包

JAR

打包方式通常採用的jar包,使用springboot的默認方式便可;web

使用maven命令:spring

mvn clean package -Dmaven.test.skip=true

執行成功以後,能夠在對應的target目錄下找到對應的包,好比:  eg-zuul-0.0.1-SNAPSHOT.jar shell

WAR

運行

內置容器運行

springboot內置了web container容器 tomcat, 能夠直接使用 java -jar命令運行;apache

例如:api

java -jar xxx/target/eg-zuul-0.0.1-SNAPSHOT.jar

image.png

外置容器運行

也可以使用war的方式,使用外置的tomcat運行,不過代碼須要改造一下:
1 改造打包方式 
打包方式改成 war包;
在pom.xml中,在version標籤的下面添加配置:tomcat

<package>war</package>

2 添加改造啓動代碼 springboot

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啓動;網絡

3 配置外置tomcat app

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帶來的困難)

測試業務層 

測試REST 

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測試 

當依賴的服務尚未開發完畢,而須要測試的功能卻強烈依賴,可使用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 ,監控運行狀態,進行一些簡單的管理

WEB監控

引入依賴:

<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";
    }


}

image.png

 

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;
        }

    }
}

image.png

JMX監控

相對於http監控,也提供了jmx的監控方式;

典型使用方式使用的是jdk的 jconsole,使用jmx協議鏈接本地的jvm,進行監控,MBean下的Health下能夠查看到返回信息;以此來進行監控。

原創不易,轉載請註明出處。

相關文章
相關標籤/搜索