EDAS- ”性感“ 微服务剖析

  1. 云栖社区>
  2. 博客>
  3. 正文

EDAS- ”性感“ 微服务剖析

张医博 2019-06-25 11:56:21 浏览8644
展开阅读全文

背景

对于一直以来阿里云的 EDAS 中间件微服务应用开发、部署,都有这独特的性感,很多支持同时 渴望不可及。在现有行业微服务开发热火朝天,开发简单、部署高效、成熟的 EDAS 产品支持等优势,让我们今天从代码入手 ,让 ”性感“ 触手可摸;

EDAS 支持开发模式

  • dubbo ,原生 dubbo 平移到 EDAS,通过 pandoraboot 方式将 dubbo 转化为了 hsf 兼容了 dubbo 开发;
  • Spring cloud ,原生方式接入到 EDAS;
  • hsf ,天然支持,通过 pandora 容器方式进行开发;

典型 RPC

今天所有的演示、讲解都通过经典的 RPC 调用,服务的注册、发现、调用等维度进行说明,同时将会结合限流降级的功能一起演示;

image.png

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 完成,没有使用任何相关脚本;下面开始实践操作;

image.png

根据截图分解每个主要功能含义:

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 的容器。

image.png

4)创建部署环境;

image.png

image.png

部署好后,左侧菜单是应用维度支持的组建功能,右上角是对应用的所有操作按钮;

image.png

针对应用所有的操作都可以在 “变更记录” 中看到,所有应用发布出现的异常都可以通过发布单排查分析;

5)部署应用

image.png

image.png

部署完成后,应用状态 “运行正常” agent 正常说明部署已经成功,下面开始测试。
部署任意 CONSUMER PROVIDER 都可以用我们编写的 indexservlet 测试类测试;

6)最后测试

本文中只部署了一个 provider 应用,可以在 ECU 上直接进行测试,可以通过 curl 的方式模式一个 http 请求;

image.png

未完待续......

网友评论

登录后评论
0/500
评论
张医博
+ 关注