SpringBoot Admin 2.0 통합 Arthas 의 실현 절차

프로젝트 초기 에 Arthas 를 사용 한 목적 은 주로 두 가지 가 있 습 니 다.
  • arthas 를 통 해 테스트 환경,성능 테스트 환경 과 생산 환경 성능 문제 분석 도 구 를 실현 하 는 문 제 를 해결 합 니 다
  • jad,mc,redefine 기능 조합 을 사용 하여 생산 환경 일부 노드 코드 열 업데이트 능력 을 실현 합 니 다.
  • 기술 선택 관련
    회 사 는 아직 비교적 통 일 된 생산 마이크로 서비스 배치 와 상태 관리 능력 을 구축 하지 못 했 기 때문에 각 시스템 의 연구 개발 운영 은 비교적 독립 적 이다.현재 프로젝트 는 Spring Cloud 와 Eureka 의 프레임 워 크 구 조 를 사용 하여 SBA 의 기초 지지 능력 과 일치 하 는 동시에 SBA 는 서비스 감지,로그 등급 설정 관리,그리고 actuator 를 바탕 으로 하 는 JVM,Spring 용기 의 여러 관리 플러그 인 을 제공 하여 기본 적 인 사용 수 요 를 만족 시 킬 수 있 습 니 다.
    조사 연구 기간 에 Arthas 전체 버 전 은 3.4.5 로 Webconsole 기반 Tunner Server 모델 을 제 공 했 고 앞의 링크 글 을 통 해 실천 되 었 으 며 SBA 와 통합 할 수 있 습 니 다.프로젝트 자체 에 역사적 부담 이 없 기 때문에 실제 통합 과정 에서 SBA 2.0 버 전 을 사용 하여 더 많은 관리 기능 과 그래 픽 인터페이스 능력 을 제공 합 니 다.기타 장점:
  • 웹 콘 솔 인터페이스 에 SBA 전체 암호 로그 인과 웹 페이지 권한 관리 가 삽입 되 어 SBA 에 로그 인 한 후에 야 관련 arthas 웹 콘 솔 의 기능 을 사용 할 수 있 습 니 다
  • SBA 클 라 이언 트 가 의존 하 는 jolokia-core 를 바탕 으로 목표 서비스 프로 세 스 를 개방 하 는 jmx 관 리 는 jmx 인터페이스 재 활용 SBA 의 관련 조작 인터페이스 를 실현 하여 전단 인터페이스 개발 능력 에 대한 요 구 를 줄인다
  • 전체 구조

    몇 가지 관건 은 JVM 에 Arthas Spring Boot 플러그 인 을 내장 하고 공상 은행 의 모델 을 참고 하여 완벽 한 클 라 이언 트 다운로드 와 스 크 립 트 수정 을 통 해 원 격 통 제 를 실현 합 니 다.내장 방안 의 작업 개 발 량 이 적 고 관련 소스 구성 요 소 를 통합 하면 관련 원 격 사용 모델 을 실현 하고 안전 을 병행 할 수 있다.공 은의 방안 은 크 고 전체 구조 계획 에 적합 하 며 연구 개발 팀 이 있 는 도 시 를 배치 하 는 데 적합 하 다.내 장 된 프로젝트 는 JMX 를 통한 시작 정지 동작(3.4.5 기반 Spring Boot 플러그 인 은 관련 핸들 을 가 져 올 수 없고 일시 적 으로 실행 할 수 없 음)을 포함 하 며 기본적으로 시작 하지 않 습 니 다.원 격 JMX 개통 후 JVM 은 관련 스 레 드 8 개 를 추가 하고 가상 머 신 메모리 30MB 정 도 를 새로 추 가 했 으 며,본 고 에서 참고 한 SBA 1.0 방안 과 마찬가지 로 온라인 오픈 전 JVM 메모리 가 지원 되 는 지 고려 해 야 한다.
    실현 효과
    SBA 2.0 의 가장 큰 편 의 는 외부 웹 페이지 를 설정 화 하 는 능력 을 제공 하 는 것 이다.또한 웹 페이지 가 현재 JVM 프로 세 스 를 실현 하면 Spring-security 의 로 컬 권한 관 리 를 실현 할 수 있 고 생산 환경 에서 SBA 에 로그 인 한 후에 만 관련 통 합 된 arthas 기능 을 사용 할 수 있다.
    로그 인 인터페이스

    외 장 연결 위치

    JMX 의 사용

    점프 아 트 하 스 웹 콘 솔
    개조 안
    1.전체 공정 구조

    전체 프로젝트 는 SBA 오픈 소스 프로젝트 의 example 프로젝트 를 수정 하고 custom-ui 를 구체 적 으로 사용 하 는 프로젝트 링크 는[spring-boot-admin-sample-custom-ui], 입 니 다.빨간색 상자 의 부분 은 arthas 웹 콘 솔 의 모든 정적 파일 입 니 다.Maven Resource 의 지정 한 설정 을 통 해 지정 한 디 렉 터 리 에 입력 하여 SBA 가 시 작 될 때 사용자 정의 로 딩 을 실현 합 니 다.maven resource 설정-아래:
    
    <resource>
                    <directory>static</directory>
                    <targetPath>${project.build.directory}/classes/META-INF/spring-boot-admin-server-ui/extensions/arthas
                    </targetPath>
                    <filtering>false</filtering>
                </resource>
    
    2.외부 링크 설정
    SBA 2.0 은 vue 온 가족 통 을 사용 하기 시 작 했 기 때문에 확장 집성 이 모두 편리 하 다.그 중에서 공식 문 서 는 외부 연결 의 설정 방식 을 제시 했다[Linking / Embedding External Pages]
    sba example 프로젝트 의 application.yml 설정 을 참고 하면 됩 니 다.
    
    # tag::customization-external-views[]
        spring:
          boot:
            admin:
              ui:
                external-views:
                  - label: "Arthas Console"
                    url: http://21.129.49.153:8080/
                    order: 1900
        # end::customization-external-views[]
    
    3.스프링 MVC 컨트롤 러 에 대응
    원래 실 현 된 SBA 통합 부분 을 참조 하여 이 부분 은 다음 과 같은 기능 을 수행 합 니 다.
  • tunnel server 가 인 스 턴 스 목록 을 불 러 온 리 셋 을 실현 하고 링크 를 선택 할 수 있 도록 전단 AgentID 상자 에 보 여 줍 니 다
  • 4.567917.사용자 정의 IP 주소 의 갱신 을 실현 합 니 다(생산 환경 에서 이중 생산 IP 와 운영 단계 IP 가 일치 하지 않 는 문 제 를 해결 합 니 다).
    4.Arthas Spring Boot 플러그 인 수정 및 설정
    원래 실 현 된 SBA 통합 플러그 인 수정 및 클 라 이언 트 설정 application.yml 참조.
    원본 Spring boot 플러그 인 에 대한 수정 은 기 존 플러그 인 이 Spring 의@Conditional OnMissingBean 을 통 해 자동 으로 불 러 오 는 것 입 니 다.
    수정 은 주로 이 부분 을 수정 하여 프로필 을 통 해 기본적으로 시작 하지 않 고 사용 할 때 원 격 으로 관련 에이전트 라인 을 시작 합 니 다.
    5.Spring Actuator 기반 JMX 구현
    SBA client 는 maven 도입 에서 기본적으로 jolokia-core.jar 를 도입 합 니 다.SBA client 의존 으로 이 가방 을 자체 도입 할 수 없 으 면 actuator 를 통 해 http 기반 jmx 작업 능력 과 SBA 콘 솔 의 관련 기능 을 틈새 없 이 개방 할 수 있 습 니 다.
    application.yml 에서 management 관련 설정 을 개방 하고 자신의 환경 상황 에 따라 클 라 이언 트 측 에서 Spring security 인증 을 열 수 있 으 며 SBA 도 서 비 스 를 통 해 암호 보호 actuator 터미널 의 방문 을 잘 지원 할 수 있 습 니 다.
    
    #  management
        management:
          endpoints:
            web:
              exposure:
                #    *                 ,            
                include: "*"
                exclude: env
          endpoint:
            health:
              #            。
              show-details: ALWAYS
          health:
            status:
              http-mapping:
                #                 http    
                FATAL:  503
    
    JMX 는 원문 에서 Environment ChangeListener 의 실현 방향 을 참고 하고 Spring 의 JMX 주 해 를 바탕 으로 실현 하면 된다.
    
    @Component
       @ManagedResource(objectName = "com.ArthasAgentManageMbean:name=ArthasMbean", description = "Arthas    Mbean")
       public class ArthasMbeanImpl {
       
           @Autowired
           private Map<String, String> arthasConfigMap;
       
           @Autowired
           private ArthasProperties arthasProperties;
       
           @Autowired
           private ApplicationContext applicationContext;
       
           /**
            *    
            *
            * @return
            */
           private ArthasAgent arthasAgentInit() {
               arthasConfigMap = StringUtils.removeDashKey(arthasConfigMap);
               //         
               Map<String, String> mapWithPrefix = new HashMap<String, String>(arthasConfigMap.size());
               for (Map.Entry<String, String> entry : arthasConfigMap.entrySet()) {
                   mapWithPrefix.put("arthas." + entry.getKey(), entry.getValue());
               }
               final ArthasAgent arthasAgent = new ArthasAgent(mapWithPrefix, arthasProperties.getHome(),
                       arthasProperties.isSlientInit(), null);
               arthasAgent.init();
               return arthasAgent;
           }
       
           @ManagedOperation(description = "    Arthas Tunnel Server  ")
           public String getArthasTunnelServerUrl() {
               return arthasProperties.getTunnelServer();
           }
       
           @ManagedOperation(description = "  Arthas Tunnel Server  ,  attach   ")
           @ManagedOperationParameter(name = "tunnelServer", description = "example:ws://127.0.0.1:7777/ws")
           public Boolean setArthasTunnelServerUrl(String tunnelServer) {
               if (tunnelServer == null || tunnelServer.trim().equals("") || tunnelServer.indexOf("ws://") < 0) {
                   return false;
               }
               arthasProperties.setTunnelServer(tunnelServer);
               return true;
           }
       
           @ManagedOperation(description = "  AgentID")
           public String getAgentId() {
               return arthasProperties.getAgentId();
           }
       
           @ManagedOperation(description = "      ")
           public String getAppName() {
               return arthasProperties.getAppName();
           }
       
           @ManagedOperation(description = "  ArthasConfigMap")
           public HashMap<String, String> getArthasConfigMap() {
               return (HashMap) arthasConfigMap;
           }
       
           @ManagedOperation(description = "        Arthas agent")
           public Boolean isArthasAttched() {
               DefaultListableBeanFactory defaultListableBeanFactory = (DefaultListableBeanFactory) applicationContext.getAutowireCapableBeanFactory();
               String bean = "arthasAgent";
               if (defaultListableBeanFactory.containsBean(bean)) {
                   return true;
               }
               return false;
           }
       
           @ManagedOperation(description = "  Arthas agent")
           public Boolean startArthasAgent() {
               DefaultListableBeanFactory defaultListableBeanFactory = (DefaultListableBeanFactory) applicationContext.getAutowireCapableBeanFactory();
               String bean = "arthasAgent";
               if (defaultListableBeanFactory.containsBean(bean)) {
                   ((ArthasAgent) defaultListableBeanFactory.getBean(bean)).init();
                   return true;
               }
               defaultListableBeanFactory.registerSingleton(bean, arthasAgentInit());
               return true;
           }
       
           @ManagedOperation(description = "  Arthas agent,    ")
           public Boolean stopArthasAgent() {
               // TODO        tmp      classLoader,       com.taobao.arthas.core.server.ArthasBootstrap    destroy  
               DefaultListableBeanFactory defaultListableBeanFactory = (DefaultListableBeanFactory) applicationContext.getAutowireCapableBeanFactory();
               String bean = "arthasAgent";
               if (defaultListableBeanFactory.containsBean(bean)) {
                   defaultListableBeanFactory.destroySingleton(bean);
                   return true;
               } else {
                   return false;
               }
           }
       }
    
    실제 사용
    관리 공사 가 생산 에 들 어간 후 여러 차례 생산 환경 에서 문제 조사 와 코드 열 복원 에 사용 되 었 다.성능 문 제 는 주로 성능 흐름 제어 구성 요소 와 그 레이스 케 일 발표 관련 설정 매개 변수 에 대한 온라인 검증 과 debug 에 사 용 됩 니 다.
    코드 열 로드 관련 초기 에는 jad+mc 방식 으로 작업 을 진행 하 였 으 며,나중에 jad 가 일부 코드 에서 환경 설정 및 jvm 문제 로 인해 반 컴 파일 코드 가 일치 하지 않 는 상황 을 발견 하 였 으 며,추 후 Maven 패키지 배치 응용 프로그램 source 압축 패 키 지 를 통 해 해결 하 였 으 며,jar 와 같은 버 전 으로 구 축 된 source 를 직접 사용 하여 수정 하 는 것 이 더욱 신뢰 할 수 있 습 니 다.전체 방안 은 관리 가 비교적 엄격 한 생산 환경 에서 효과 적 인 성능 분석 과 열 복원 능력 을 제공 했다.
    남 겨 진 문제
    기 존 공식 적 으로 제 공 된 com.taobao.arthas.agent.attach.arthasAgent 에서 arthas 에이전트 를 시작 하 는 클 라 이언 트 가 사용 하 는 arthasClassLoader 와 bootstrapClass 는 모두 방법 내 임시 변수 로 외부 에서 관련 핸들 을 가 져 올 수 없습니다.bootstrapClass 를 통 해 arthas 에이전트 를 닫 는 기능 을 수행 합 니 다.임시 솔 루 션 은 JMX 를 통 해 시작 한 후 웹 콘 솔 연결 을 사용 한 후 stop 명령 을 사용 하여 대상 프로 세 스 의 arthas 에이전트 를 닫 는 것 입 니 다.
    기 존 바이트 코드 로 딩 도 구 는 내부 클래스,개인 클래스 의 온라인 열 배치 교 체 를 잘 실현 할 수 있 으 며,테스트 를 통 해 SkyWalk 8.x 버 전의 자바 에이전트 플러그 인 을 호 환 할 수 있 습 니 다.그러나 테스트 환경 에 서 는 jacoco 커버 리 지 채집 플러그 인과 Arthas 바이트 코드 가 호 환 되 지 않 는 상황 이 설정 되 어 있 습 니 다.일부 환경 에서 사용 할 때 대응 하 는 에이 전 트 를 먼저 닫 아야 arthas 와 관련 된 기능 을 정상적으로 사용 할 수 있다.
    start.aliyun.com 지행 착수 실험실 체험 Arthas 57 개 착수 실험 에 오신 것 을 환영 합 니 다:

    이상 은 SpringBoot Admin 2.0 통합 Arthas 의 실현 절차 에 대한 상세 한 내용 입 니 다.SpringBoot Admin 2.0 통합 Arthas 에 관 한 자 료 는 저희 의 다른 관련 글 을 주목 해 주 십시오!

    좋은 웹페이지 즐겨찾기