天天看點

EDAS- ”性感“ 微服務剖析

背景

對于一直以來阿裡雲的 EDAS 中間件微服務應用開發、部署,都有這獨特的性感,很多支援同時 渴望不可及。在現有行業微服務開發熱火朝天,開發簡單、部署高效、成熟的 EDAS 産品支援等優勢,讓我們今天從代碼入手 ,讓 ”性感“ 觸手可摸;

EDAS 支援開發模式

  • dubbo ,原生 dubbo 平移到 EDAS,通過 pandoraboot 方式将 dubbo 轉化為了 hsf 相容了 dubbo 開發;
  • Spring cloud ,原生方式接入到 EDAS;
  • hsf ,天然支援,通過 pandora 容器方式進行開發;

典型 RPC

今天所有的示範、講解都通過經典的 RPC 調用,服務的注冊、發現、調用等次元進行說明,同時将會結合限流降級的功能一起示範;

EDAS- ”性感“ 微服務剖析

PROVIDER

作為 RPC 中核心的角色,部署業務代碼的關鍵,對外暴露出服務接口,通過注冊的方式,将服務注冊到 EDAS 服務中心;

itemcenter-api

package com.alibaba.edas.carshop.itemcenter;

/**
 * Alibaba Group EDAS. http://www.aliyun.com/product/edas
 */
public interface ItemService {

    public Item getItemById( long id );
    
    public Item getItemByName( String name );
    
}           
  • 暴露服務接口,主要提供了兩個方式,getItemById 擷取商品 ID,getItemByName 擷取商品名稱

itemcenter

package com.alibaba.edas.carshop.itemcenter;


/**
 * Alibaba Group EDAS. http://www.aliyun.com/product/edas
 */
public class ItemServiceImpl implements ItemService {

    @Override
    public Item getItemById( long id ) {
        Item car = new Item();
        car.setItemId( 1l );
        car.setItemName( "Mercedes Benz" );
        return car;
    }
    @Override
    public Item getItemByName( String name ) {
        Item car = new Item();
        car.setItemId( 1l );
        car.setItemName( "Mercedes Benz" );
        return car;
    }
}           
  • itemservice 主要用來實作接口的 getItemById getItemByName 這兩個方法;
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:hsf="http://www.taobao.com/hsf"
       xmlns="http://www.springframework.org/schema/beans"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
       http://www.taobao.com/hsf
       http://www.taobao.com/hsf/hsf.xsd" default-autowire="byName">
    <bean id="itemService" class="com.alibaba.edas.carshop.itemcenter.ItemServiceImpl" />
    <!-- 提供一個服務示例 -->
    <hsf:provider id="itemServiceProvider" interface="com.alibaba.edas.carshop.itemcenter.ItemService"
        ref="itemService" version="1.0.0">
    </hsf:provider>
</beans>           
  • 通過 spring 文法注入 itemservice 方法,将服務暴露出去; 如果在 hsf 中沒有用 group 的方式,預設服務注冊時配置設定的組是 hsf ,舊版本由于不支援多租戶的概念是以 hsf 文法中必須加入 group=
package com.alibaba.edas.carshop.itemcenter;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Alibaba Group EDAS. http://www.aliyun.com/product/edas
 */
public class IndexServlet extends HttpServlet {

    private static final long serialVersionUID = -112210702214857712L;

    @Override
    public void doGet( HttpServletRequest req, HttpServletResponse resp ) throws ServletException, IOException {
        PrintWriter writer = resp.getWriter();
        writer.write("OK");
        return;
    }
    
    @Override
    protected void doPost( HttpServletRequest req, HttpServletResponse resp ) throws ServletException, IOException {
        return;
    }

}           
  • 在本例中通過 servlet 的方式做了一個簡單的測試 demo,在 provider 部署成功後,可以直接測試;

CONSUMER

消費者 detail 訂閱到 itemservice 服務後開始調用;具體也是通過 spring 的方法注入,bean 檔案的文法格式和 PROVIDER 的 bean 檔案的一緻;

@Override
    public void contextInitialized( ServletContextEvent sce ) {
        ApplicationContext ctx = WebApplicationContextUtils.getWebApplicationContext( sce.getServletContext() );
        final ItemService itemService = ( ItemService ) ctx.getBean( "item" );
        Thread thread = new Thread( new Runnable() {
            @Override
            public void run() {
                while ( true ) {
                    try {
                        Thread.sleep( 500l );
                        System.out.println( itemService.getItemById( 1111 ) );
                        System.out.println( itemService.getItemByName( "myname is le" ) );
                    } catch ( Throwable e ) {
                        e.printStackTrace();
                    }
                }
            }
        } );
        thread.start();
    }           
public class IndexServlet extends HttpServlet {

    private static final long serialVersionUID = -112210702214857712L;

    @Override
    public void doGet( HttpServletRequest req, HttpServletResponse resp ) throws ServletException, IOException {
        final ItemService itemService = ( ItemService ) StartListener.CONTEXT.getBean("item");
        Item item = itemService.getItemByName(req.getParameter("name"));
        
        PrintWriter write = resp.getWriter();
        write.write(String.format("item id: %s, item name: %s", item.getItemId(),item.getItemName()    ));
    }
    
    @Override
    protected void doPost( HttpServletRequest req, HttpServletResponse resp ) throws ServletException, IOException {
    }

}           
  • 訂閱的服務 ID 命名為 item
  • 消費者 demo 中通過 pandoraboot 方式啟動了一個容器;每 500ms 列印一次
  • indexservlet 中同樣是提供了一個測試類

開始部署

所有部署過程都是由用戶端 ECU 上的 configclient 完成,沒有使用任何相關腳本;下面開始實踐操作;

EDAS- ”性感“ 微服務剖析

根據截圖分解每個主要功能含義:

1)命名空間,邏輯對資源進行隔離管理,不通命名空間下的應用無法互相調用;

2)叢集類型:swarm 叢集、ECS 叢集、容器服務 k8s 叢集,叢集是對 ECS 機器的統一管理;

3)應用部署方式:jar、war、鏡像部署;

3.1) jar 普通的 java 應用,直接打包成 jar 後即可部署;

3.2) war ,web 類型的應用;

3.3) 通過 docker 鏡像的方式部署應用;

應用環境比較特殊,原生的 sc 應用,和 Spring cloud pandora 的方式不一樣,需要部署普通的标準 java 環境,後者需要部署 edas-container 的容器。

EDAS- ”性感“ 微服務剖析

4)建立部署環境;

EDAS- ”性感“ 微服務剖析
EDAS- ”性感“ 微服務剖析

部署好後,左側菜單是應用次元支援的組建功能,右上角是對應用的所有操作按鈕;

EDAS- ”性感“ 微服務剖析

針對應用所有的操作都可以在 “變更記錄” 中看到,所有應用釋出出現的異常都可以通過釋出單排查分析;

5)部署應用

EDAS- ”性感“ 微服務剖析
EDAS- ”性感“ 微服務剖析

部署完成後,應用狀态 “運作正常” agent 正常說明部署已經成功,下面開始測試。

部署任意 CONSUMER PROVIDER 都可以用我們編寫的 indexservlet 測試類測試;

6)最後測試

本文中隻部署了一個 provider 應用,可以在 ECU 上直接進行測試,可以通過 curl 的方式模式一個 http 請求;

EDAS- ”性感“ 微服務剖析

未完待續......

繼續閱讀