背景
对于一直以来阿里云的 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 请求;
未完待续......