背景
對于一直以來阿裡雲的 EDAS 中間件微服務應用開發、部署,都有這獨特的性感,很多支援同時 渴望不可及。在現有行業微服務開發熱火朝天,開發簡單、部署高效、成熟的 EDAS 産品支援等優勢,讓我們今天從代碼入手 ,讓 ”性感“ 觸手可摸;
EDAS 支援開發模式
- dubbo ,原生 dubbo 平移到 EDAS,通過 pandoraboot 方式将 dubbo 轉化為了 hsf 相容了 dubbo 開發;
- Spring cloud ,原生方式接入到 EDAS;
- hsf ,天然支援,通過 pandora 容器方式進行開發;
典型 RPC
今天所有的示範、講解都通過經典的 RPC 調用,服務的注冊、發現、調用等次元進行說明,同時将會結合限流降級的功能一起示範;

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 完成,沒有使用任何相關腳本;下面開始實踐操作;
根據截圖分解每個主要功能含義:
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 的容器。
4)建立部署環境;
部署好後,左側菜單是應用次元支援的組建功能,右上角是對應用的所有操作按鈕;
針對應用所有的操作都可以在 “變更記錄” 中看到,所有應用釋出出現的異常都可以通過釋出單排查分析;
5)部署應用
部署完成後,應用狀态 “運作正常” agent 正常說明部署已經成功,下面開始測試。
部署任意 CONSUMER PROVIDER 都可以用我們編寫的 indexservlet 測試類測試;
6)最後測試
本文中隻部署了一個 provider 應用,可以在 ECU 上直接進行測試,可以通過 curl 的方式模式一個 http 請求;
未完待續......