全部产品
云市场

开发 HSF 应用(EDAS SDK)

更新时间:2019-10-11 15:36:08

介绍如何使用 EDAS-SDK 快速开发 HSF 应用,完成服务注册与发现。

下载 Demo 工程

您可以按照本文的步骤一步步搭建出最终的工程,也可以选择直接下载本文对应的示例工程,或者使用 Git 下载: git clone https://github.com/aliyun/alibabacloud-microservice-demo.git

该项目包含了众多了示例工程,本文对应的示例工程位于 alibabacloud-microservice-demo/microservice-doc-demo/hsf-ali-tomcat,里面包含 itemcenter-apiitemcenterdetail 三个 Maven 工程文件夹。

  • itemcenter-api:提供接口定义
  • itemcenter:服务提供者
  • detail:消费者服务

说明:请使用 JDK 1.7 及以上版本。

定义服务接口

HSF 服务基于接口实现,当接口定义好之后,生产者将使用该接口实现具体的服务,消费者也基于此接口去订阅服务。

在 Demo 的itemcenter-api工程中,定义了一个服务接口 com.alibaba.edas.carshop.itemcenter.ItemService,内容如下:

  1. public interface ItemService {
  2. public Item getItemById(long id);
  3. public Item getItemByName(String name);
  4. }

该服务接口将提供两个方法:getItemByIdgetItemByName

开发服务提供者

服务提供者将实现服务接口以提供具体服务。同时,如果使用了 Spring 框架,还需要在 xml 文件中配置服务属性。

说明:Demo 工程中的 itemcenter 文件夹为服务提供者的示例代码。

实现服务接口

可以参考ItemServiceImpl.java文件中的示例:

  1. public class ItemServiceImpl implements ItemService {
  2. @Override
  3. public Item getItemById( long id ) {
  4. Item car = new Item();
  5. car.setItemId( 1l );
  6. car.setItemName( "Mercedes Benz" );
  7. return car;
  8. }
  9. @Override
  10. public Item getItemByName( String name ) {
  11. Item car = new Item();
  12. car.setItemId( 1l );
  13. car.setItemName( "Mercedes Benz" );
  14. return car;
  15. }
  16. }

服务提供者配置

上述示例主要实现了 com.alibaba.edas.carshop.itemcenter.ItemService,并在两个方法中返回了一个 Item 对象。代码开发完成之后,除了在 web.xml 中进行必要的常规配置,您还需要增加相应的 Maven 依赖,同时在 Spring 配置文件使用 <hsf /> 标签注册并发布该服务。具体内容如下:

  1. pom.xml中添加如下 Maven 依赖:
    1. <dependencies>
    2. <!-- 添加 servlet 的依赖 -->
    3. <dependency>
    4. <groupId>javax.servlet</groupId>
    5. <artifactId>servlet-api</artifactId>
    6. <version>2.5</version>
    7. <scope>provided</scope>
    8. </dependency>
    9. <!-- 添加 Spring 的依赖 -->
    10. <dependency>
    11. <groupId>com.alibaba.edas.carshop</groupId>
    12. <artifactId>itemcenter-api</artifactId>
    13. <version>1.0.0-SNAPSHOT</version>
    14. </dependency>
    15. <!-- 添加服务接口的依赖 -->
    16. <dependency>
    17. <groupId>org.springframework</groupId>
    18. <artifactId>spring-web</artifactId>
    19. <version>2.5.6(及其以上版本)</version>
    20. </dependency>
    21. <!-- 添加 edas-sdk 的依赖 -->
    22. <dependency>
    23. <groupId>com.alibaba.edas</groupId>
    24. <artifactId>edas-sdk</artifactId>
    25. <version>1.8.1</version>
    26. </dependency>
    27. </dependencies>
  2. hsf-provider-beans.xml 文件中增加 Spring 关于 HSF 服务的配置。

    1. <?xml version="1.0" encoding="UTF-8"?>
    2. <beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    3. xmlns:hsf="http://www.taobao.com/hsf"
    4. xmlns="http://www.springframework.org/schema/beans"
    5. xsi:schemaLocation="http://www.springframework.org/schema/beans
    6. http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
    7. http://www.taobao.com/hsf
    8. http://www.taobao.com/hsf/hsf.xsd" default-autowire="byName">
    9. <!-- 定义该服务的具体实现 -->
    10. <bean id="itemService" class="com.alibaba.edas.carshop.itemcenter.ItemServiceImpl" />
    11. <!-- 用 hsf:provider 标签表明提供一个服务生产者 -->
    12. <hsf:provider id=“itemServiceProvider"
    13. <!-- 用 interface 属性说明该服务为此类的一个实现 -->
    14. interface=“com.alibaba.edas.carshop.itemcenter.ItemService"
    15. <!-- 此服务具体实现的 Spring 对象 -->
    16. ref=“itemService"
    17. <!-- 发布该服务的版本号,可任意指定,默认为 1.0.0 -->
    18. version=“1.0.0"
    19. </hsf:provider>
    20. </beans>

服务创建及发布存在一定的限制:

名称示例限制大小是否可调整
{服务名}:{版本号} com.alibaba.edas.testcase.api.TestCase:1.0.0 最大192字节
组名 HSF 最大32字节
一个 Pandora 应用实例发布的服务数 N/A 最大 800 个可在应用基本信息页面单击应用设置部分右侧的设置,在下拉列表中选择JVM,在弹出的应用设置对话框中进入自定义->自定义参数,在输入框中添加 -DCC.pubCountMax=1200 属性参数(该参数值可根据应用实际发布的服务数调整)。

服务提供者属性配置示例

  1. <bean id="impl" class="com.taobao.edas.service.impl.SimpleServiceImpl" />
  2. <hsf:provider
  3. id="simpleService"
  4. interface="com.taobao.edas.service.SimpleService"
  5. ref="impl"
  6. version="1.0.1"
  7. clientTimeout="3000"
  8. enableTXC="true"
  9. serializeType="hessian">
  10. <hsf:methodSpecials>
  11. <hsf:methodSpecial name="sum" timeout="2000" />
  12. </hsf:methodSpecials>
  13. </hsf:provider>

开发服务消费者

消费者订阅服务从代码编写的角度分为两个部分。

  1. Spring 的配置文件使用标签<hsf:consumer/>定义好一个 Bean。
  2. 在使用的时候从 Spring 的 context 中将 Bean 取出来。

说明:Demo 工程中的 detail 文件夹为消费者服务的示例代码。

配置服务属性

与生产者一样,消费者的服务属性配置分为 Maven 依赖配置与 Spring 的配置。

  1. pom.xml文件中添加 Maven 依赖。

    Maven 依赖配置与生产者相同,详情请参见开发服务提供者的配置服务属性。

  2. hsf-consumer-beans.xml 文件中添加 Spring 关于 HSF 服务的配置。

    增加消费者的定义,HSF 框架将根据该配置文件去服务中心订阅所需的服务。

    1. <?xml version="1.0" encoding="UTF-8"?>
    2. <beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    3. xmlns:hsf="http://www.taobao.com/hsf"
    4. xmlns="http://www.springframework.org/schema/beans"
    5. xsi:schemaLocation="http://www.springframework.org/schema/beans
    6. http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
    7. http://www.taobao.com/hsf
    8. http://www.taobao.com/hsf/hsf.xsd" default-autowire="byName">
    9. <!-- 消费一个服务示例 -->
    10. <hsf:consumer
    11. <!-- Bean ID,在代码中可根据此 ID 进行注入从而获取 consumer 对象 -->
    12. id="item"
    13. <!-- 服务名,与服务提供者的相应配置对应,HSF 将根据 interface + version 查询并订阅所需服务 -->
    14. interface="com.alibaba.edas.carshop.itemcenter.ItemService"
    15. <!-- 版本号,与服务提供者的相应配置对应,HSF 将根据 interface + version 查询并订阅所需服务 -->
    16. version="1.0.0"
    17. </hsf:consumer>
    18. </beans>

服务消费者配置

可以参考StartListener.java文件中的示例:

  1. public class StartListener implements ServletContextListener{
  2. @Override
  3. public void contextInitialized( ServletContextEvent sce ) {
  4. ApplicationContext ctx = WebApplicationContextUtils.getWebApplicationContext( sce.getServletContext() );
  5. // 根据 Spring 配置中的 Bean ID “item” 获取订阅到的服务
  6. final ItemService itemService = ( ItemService ) ctx.getBean( "item" );
  7. ……
  8. // 调用服务 ItemService 的 getItemById 方法
  9. System.out.println( itemService.getItemById( 1111 ) );
  10. // 调用服务 ItemService 的 getItemByName 方法
  11. System.out.println( itemService.getItemByName( "myname is le" ) );
  12. ……
  13. }
  14. }

消费者服务属性配置示例

  1. <hsf:consumer
  2. id="service"
  3. interface="com.taobao.edas.service.SimpleService"
  4. version="1.1.0"
  5. clientTimeout="3000"
  6. target="10.1.6.57:12200?_TIMEOUT=1000"
  7. maxWaitTimeForCsAddress="5000">
  8. <hsf:methodSpecials>
  9. <hsf:methodSpecial name="sum" timeout="2000" ></hsf:methodSpecial>
  10. </hsf:methodSpecials>
  11. </hsf:consumer>

本地运行服务

完成代码、接口开发和服务配置后,在 Eclipse 或 IDEA 中,可直接以 Ali-Tomcat 运行该服务(具体请参照文档开发工具准备中的配置 Eclipse 开发环境或者 IDEA 开发环境。

本地查询 HSF 服务

在开发调试的过程中,如果您的服务是通过轻量级注册配置中心进行服务注册与发现,就可以通过 EDAS 控制台查询某个应用提供或调用的服务。

假设您在一台 IP 为 192.168.1.100 的机器上启动了 EDAS 配置中心。

  1. 进入 http://192.168.1.100:8080/

  2. 在左侧菜单栏单击服务列表,输入服务名、服务组名或者 IP 地址进行搜索,查看对应的服务提供者以及服务调用者。

    说明:配置中心启动之后默认选择第一块网卡地址做为服务发现的地址,如果开发者所在的机器有多块网卡的情况,可设置启动脚本中的 SERVER_IP 变量进行显式的地址绑定。

常见查询案例

提供者列表页

  • 在搜索条件里输入 IP 地址,单击搜索即可查询该 IP 地址的机器提供了哪些服务。

  • 在搜索条件里输入服务名或服务分组,即可查询哪些 IP 地址提供了这个服务。

调用者列表页

  • 在搜索条件里输入 IP 地址,单击搜索即可查询该 IP 地址的机器调用了哪些服务。

  • 在搜索条件里输入服务名或服务分组,即可查询哪些 IP 地址调用了这个服务。

部署到 EDAS

本地使用轻量级配置及注册中心的应用可以直接部署到 EDAS 中,无需做任何修改,注册中心会被自动替换为 EDAS 上的注册中心。

集群类型可以在 ECS 集群和 Kubernetes 集群中任意选择,应用运行时环境需要选择 EDAS-Container。

创建应用

部署途径可以选择 WEB 控制台或使用工具部署,详情请参见部署应用概述

为正常打包出可供 EDAS-Container 运行的 WAR 包,需要添加如下的 Maven 打包插件

  1. pom.xml文件中添加以下打包插件的配置。

    1. <build>
    2. <finalName>itemcenter</finalName>
    3. <plugins>
    4. <plugin>
    5. <groupId>org.apache.maven.plugins</groupId>
    6. <artifactId>maven-compiler-plugin</artifactId>
    7. <version>3.1</version>
    8. </plugin>
    9. </plugins>
    10. </build>
  2. 执行 mvn clean package 将本地的程序打成 WAR 包。