SpringCloud微服務架構升級總結

1、背景node

1.1 應用系統的架構歷史

1.2 什麼是微服務?

起源:微服務的概念源於 2014 年 3 月 Martin Fowler 所寫的一篇文章「Microservices」。文中內容提到:微服務架構是一種架構模式,它提倡將單一應用程序劃分紅一組小的服務,服務之間互相協調、互相配合,爲用戶提供最終價值。web

通訊方式:每一個服務運行在其獨立的進程中,服務與服務間採用輕量級的通訊機制互相溝通(一般是基於 HTTP 的 RESTful API)。spring

微服務的常規定義:微服務是一種架構風格,一個大型複雜軟件應用由一個或多個微服務組成。系統中的各個微服務可被獨立部署,各個微服務之間是鬆耦合的。每一個微服務僅關注於完成一件任務。api

把原來的一個完整的進程服務,拆分紅兩個或兩個以上的進程服務,且互相之間存在調用關係,與原先單一的進程服務相比,就是「微服務」。(微服務是一個比較級的概念,而不是單一的概念)架構

1.3 微服務架構的優點

  • 可擴展性:在增長業務功能時,單一應用架構須要在原先架構的代碼基礎上作比較大的調整,而微服務架構只須要增長新的微服務節點,並調整與之有關聯的微服務節點便可。在增長業務響應能力時,單一架構須要進行總體擴容,而微服務架構僅須要擴容響應能力不足的微服務節點。
  • 容錯性:在系統發生故障時,單一應用架構須要進行整個系統的修復,涉及到代碼的變動和應用的啓停,而微服務架構僅僅須要針對有問題的服務進行代碼的變動和服務的啓停。其餘服務可經過重試、熔斷等機制實現應用層面的容錯。
  • 技術選型靈活:微服務架構下,每一個微服務節點能夠根據完成需求功能的不一樣,自由選擇最適合的技術棧,即便對單一的微服務節點進行重構,成本也很是低。
  • 開發運維效率更高:每一個微服務節點都是一個單一進程,都專一於單一功能,並經過定義良好的接口清晰表述服務邊界。因爲體積小、複雜度低,每一個微服務可由一個小規模團隊或者我的徹底掌控,易於保持高可維護性和開發效率。

Spring Cloud做爲目前最流行的微服務開發框架,不是採用了Spring Cloud框架就實現了微服務架構,具有了微服務架構的優點。正確的理解是使用Spring Cloud框架開發微服務架構的系統,使系統具有微服務架構的優點(Spring Cloud就像工具,還須要「作」的過程)。app

1.4 什麼是Spring Boot?什麼是Spring Cloud?

Spring Boot框架是由Pivotal團隊提供的全新框架,其設計目的是用來簡化基於Spring應用的初始搭建以及開發過程。SpringBoot框架使用了特定的方式來進行應用系統的配置,從而使開發人員再也不須要耗費大量精力去定義模板化的配置文件。負載均衡

Spring Cloud是一個基於Spring Boot實現的雲應用開發工具,它爲基於JVM的雲應用開發中的配置管理、服務註冊,服務發現、斷路器、智能路由、微代理、控制總線、全局鎖、決策競選、分佈式會話和集羣狀態管理等操做提供了一種簡單的開發方式。框架

1.5 微服務、Spring Boot、Spring Cloud三者之間的關係

  • 思想:微服務是一種架構的理念,提出了微服務的設計原則,從理論爲具體的技術落地提供了指導思想。
  • 腳手架:Spring Boot是一套快速配置腳手架,能夠基於Spring Boot快速開發單個微服務。
  • 多個組件的集合:Spring Cloud是一個基於Spring Boot實現的服務治理工具包;Spring Boot專一於快速、方便集成的單個微服務個體;Spring Cloud關注全局的服務治理框架。

2、技術解析

2.1 Everything is jar, Everything is http

Spring Boot經過@SpringBootApplication註解標識爲Spring Boot應用程序。全部的應用都經過jar包方式編譯,部署和運行。運維

@SpringBootApplication 
public class Application {     
    private static final Logger LOGGER = LoggerFactory.getLogger(Application.class);     
    public static void main(String[] args) {         
        SpringApplication.run(Application.class, args);         
        LOGGER.info(」啓動成功!");     
    } 
}

 

每一個Spring Boot的應用均可以經過內嵌web容器的方式提供http服務,僅僅須要在pom文件中依賴spring-boot-start-web便可,原則上微服務架構但願每一個獨立節點都提供http服務。分佈式

  <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

 

2.2 Spring boot Task 任務啓動和定時任務

在Spring Boot須要啓動任務時,只要繼承CommandLineRunner接口實現其run方法便可。

@SpringBootApplication 
public class ClientDataListener implements CommandLineRunner
    public void run(String... strings) throws Exception {     
        clientInfoListenerHandler(); 
    }
}

 

在Spring Boot須要執行定時任務時,只須要在定時任務方法上增長@Scheduled(cron = 「0 15 0 * * ?」)註解(支持標準cron表達式),而且在服務啓動類上增長@EnableScheduling的註解便可。

@SpringBootApplication
@EnableScheduling
public class Application {     
    private static final Logger LOGGER = LoggerFactory.getLogger(Application.class);     
    public static void main(String[] args) {         
        SpringApplication.run(Application.class, args);         
        LOGGER.info(」啓動成功!");     
    } 
}

 

// some class
@Scheduled(cron = "0 15 0 * * ?")
public void someTimeTask() {
    ***
}

 

2.3 Spring boot Actuator 監控

Actuator是spring boot提供的對應用系統自身進行監控的組件,在引入spring-boot-start-web基礎上引入spring-boot-starter-actuator便可。

 <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>

 

2.4 Spring cloud Config 配置中心

在咱們實現微服務架構時,每一個微服務節點都須要自身的相關配置數據項,當節點衆多,維護就變得很是困難,所以須要創建一箇中心配置服務。

Spring Cloud Config分爲兩部分。Spring Cloud Config server做爲一個服務進程,Spring Cloud Config File爲配置文件存放位置。

2.5 Spring cloud Eureka 服務註冊中心

服務註冊的概念早在微服務架構以前就出現了,微服務架構更是把原先的單一應用節點拆分紅很是多的微服務節點。互相之間的調用關係會很是複雜,Spring Cloud Eureka做爲註冊中心,全部的微服務均可以將自身註冊到Spring Cloud Eureka進行統一的管理和訪問(Eureka和Zookeeper不一樣,在AOP原則中選擇了OP,更強調服務的有效性)

2.6 Spring cloud Zuul 服務端智能路由

當咱們把全部的服務都註冊到Eureka(服務註冊中心)之後,就涉及到如何調用的問題。Spring Cloud Zuul是Spring Cloud提供的服務端代理組件,能夠看作是網關,Zuul經過Eureka獲取到可用的服務,經過映射配置,客戶端經過訪問Zuul來訪問實際須要須要訪問的服務。全部的服務經過spring.application.name作標識,

不一樣IP地址,相同spring.application.name就是一個服務集羣。當咱們增長一個相同spring.application.name的節點,Zuul經過和Eureka通訊獲取新增節點的信息實現智能路由,增長該類型服務的響應能力。

2.7 Spring cloud Ribbon 客戶端智能路由

與Spring Cloud Zuul的服務端代理相對應,Spring Cloud Ribbon提供了客戶端代理。在服務端代理中,客戶端並不須要知道最終是哪一個微服務節點爲之提供服務,而客戶端代理獲取實質提供服務的節點,並選擇一個進行服務調用。Ribbon和Zuul類似,也是經過和Eureka(服務註冊中心)進行通訊來實現客戶端智能路由。

2.8 Spring cloud Sleuth 分佈式追蹤

2.9 Spring cloud Zipkin 調用鏈

2.10 Spring cloud Feign http客戶端

Spring Cloud Feign是一種聲明式、模板化的http客戶端。 使用Spring Cloud Feign請求遠程服務時可以像調用本地方法同樣,讓開發者感受不到這是遠程方法(Feign集成了Ribbon作負載均衡)。

把遠程服務和本地服務作映射

@FeignClient(name = "rabbitmq-http", url = "${SKYTRAIN_RABBITMQ_HTTP}") 
public interface TaskService {     
    @RequestMapping(value = "/api/queues", method = RequestMethod.GET)     
    public String query(@RequestHeader("Authorization") String token); 
}

 

以調用本地服務的方式調用遠程服務

@Autowired 
private TaskService taskService; 
private String queryRabbitmqStringInfo() {     
    byte[] credentials = Base64 .encodeBase64((rabbitmqHttpUserName + ":" + rabbitmqHttpPassword).getBytes(StandardCharsets.UTF_8));     
    String token = "Basic " + new String(credentials, StandardCharsets.UTF_8);     
    return taskService.query(token); 
}

 

2.11 Spring cloud Hystrix 斷路器

3、微服務實踐

3.1 咱們開發的幾個微服務組件—應用管理中心

應用管理中心能夠對每一個已經註冊的微服務節點進行中止,編譯,打包,部署,啓動的完整的上線操做。

3.2 咱們開發的幾個微服務組件—zookeeper數據查詢中心

zookeeper數據查詢中心根據zookeeper地址,端口,命令獲取zookeeper數據信息。

3.3 咱們開發的幾個微服務組件—微服務健康檢測中心

健康檢測中心週期性檢查每一個微服務的狀態,當發現有微服務狀態處於DOWN或鏈接超時時,觸發報警。

3.4 咱們開發的幾個微服務組件—定時任務查詢中心

// 在BeanPostProcessor子類中攔截
@Component
public class SkytrainBeanPostProcessor implements BeanPostProcessor, Ordered {
    ***
    /**
     * Bean 實例化以後進行的處理
     */
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        beanPostProcessor.postProcessAfter(bean, beanName);
        return bean;
    }
    ***
}
// 攔截後獲取定時任務註解
***
public Object postProcessAfter(Object bean, String beanName) {
    Class targetClass = AopUtils.getTargetClass(bean);
    Map annotatedMethods = MethodIntrospector.selectMethods(targetClass,
            new MethodIntrospector.MetadataLookup() {
 
                public Set inspect(Method method) {
 
                    Set scheduledMethods = AnnotatedElementUtils.getMergedRepeatableAnnotations(method,
                            Scheduled.class, Schedules.class);
                    return (!scheduledMethods.isEmpty() ? scheduledMethods : null);
                }
            });
    if (!annotatedMethods.isEmpty()) {
        String className = targetClass.getName();
        for (Map.Entry entry : annotatedMethods.entrySet()) {
            Method method = entry.getKey();
            for (Scheduled scheduled : entry.getValue()) {
                String key = className + ":" + method.getName();
                String value = scheduled.toString();
                taskInfos.put(key, value);
            }
        }
    }
    return null;
}
***
 
// 獲取定時任務後註冊
***
public void taskRegister() {
    String nodeInfo = ipAddress + ":" + serverPort + ":";
    try {
        /**
         * 定時任務
         */
        Map infos = taskInfos;
        for (Entry item : infos.entrySet()) {
            String taskId = nodeInfo + item.getKey();
            String taskParameter = item.getValue();
            JSONObject info = new JSONObject();
            info.put("taskId", taskId);
            info.put("taskParameter", taskParameter);
            info.put("applicationName", applicationName);
            info.put("taskType", "schedule");
            LOGGER.info(info.toString());
            zooKeeperExecutor.createZKNode(SKYTRAIN_TASK_ZKNODE_PREFIX + taskId, info.toString());
        }
    }
    catch (Exception ex) {
        LOGGER.error("", ex);
    }
}
***

 

3.5 微服務的分類

  • 微服務平臺組件
  • 公共服務組件
  • 基礎服務組件/業務服務組件

3.6 總體微服務架構圖

做者:梁鑫

來源:宜信技術學院

相關文章
相關標籤/搜索