本文十分感谢:https://help.aliyun.com/document_detail/99943.html?spm=a2c4g.11186623.6.607.1e112385pAFx19
在文章的基础上,经过了测试。
**
自己犯的错误总结:
自己犯的错误总结:
本地hosts必须配成127.0.0.1 不能使localhost
必须把注册中心安装在本地。
maven在idea中配置成自己修改了私服的maven地址
不行就重启idea,重启mac
生产者消费者只需要启动tomcat就能出现,不需要访问任何,如果出现不了往下看,可能是tomcat配置路径的问题,再不行就重启idea,重启mac
我自己之前配置过一次Alitomcat,这次下载又把原来的删掉了,所以这次的tomcat目录还是原来的tomcat目录,虽然名字一样,路径是对的,所以不能成功的显示在个人管理的消费者列表中,直到我重新配置了一次Alitomcat,一切正常了 **
运行方式就是下面的demo中的生产者和消费者都发布到一个tomcat中。然后运行idea中的tomcat即可。当然消费者可以访问localhost:8081/index.htm
成功页面:
Ali-Tomcat 是 EDAS 中的服务运行时可依赖的一个容器,它主要集成了服务的发布、订阅、调用链追踪等一系列的核心功能。无论是开发环境还是运行时,您均可将应用程序发布在该容器中。
Pandora 是一个轻量级的隔离容器,也就是 taobao-hsf.sar。它用来隔离应用和中间件的依赖,也用来隔离中间件之间的依赖。EDAS 的 Pandora 中集成了服务发现、配置推送和调用链跟踪等各种中间件功能产品插件。您可以利用这些插件对 EDAS 应用进行服务监控、治理、跟踪、分析等全方位运维管理。
如您未使用过 HSF,请避免使用 Ali-Tomcat 来开发 EDAS 应用。
注意:在 EDAS 中,只有 WAR 形式的 Web 应用才能使用 Ali-Tomcat。
Ali-Tomcat 和 Pandora 为 EDAS 中的服务运行时所依赖的容器,主要集成了服务的发布、订阅、调用链追踪等一系列的核心功能,无论是开发环境还是运行时,均必须将应用程序发布在该容器中。
注意:请使用 JDK 1.7及以上版本。
下载 Ali-Tomcat,保存后解压至相应的目录(如:d:\work\tomcat\)。
下载 Pandora 容器,保存后将内容解压至上述保存的 Ali-Tomcat 的 deploy 目录(d:\work\tomcat\deploy)下。
查看 Pandora 容器的目录结构。
Linux 系统中,在相应路径下执行 tree -L 2 deploy/ 命令查看目录结构。
d:\work\tomcat > tree -L 2 deploy/
deploy/
└── taobao-hsf.sar
├── META-INF
├── lib
├── log.properties
├── plugins
├── sharedlib
└── version.properties
Windows 中,直接进入相应路径进行查看。
如果您在安装和使用 Ali-Tomcat 和 Pandora 过程中遇到问题,请参见 Ali-Tomcat 问题和 Pandora 问题进行定位、解决。
您在本地开发应用时,需要使用 Eclipse 或 IntelliJ IDEA。本节将分别介绍如何配置 Eclipse 或 IntelliJ IDEA 开发环境。
配置 Eclipse 需要下载 Tomcat4E 插件,并存放在安装 Ali-Tomcat 时 Pandora 容器的保存路径中,配置之后开发者可以直接在 Eclipse 中发布、调试本地代码。具体步骤如下:
打开 Eclipse,在菜单栏中选择 Help > Install New Software。
在 Install 对话框中 Work with 区域右侧单击 Add,然后在弹出的 Add Repository 对话框中单击 Local。在弹出的对话框中选中已下载并解压的 Tomcat4E 插件的目录(d:\work\tomcat4e\)>,单击 OK。
返回 Install 对话框,单击 Select All,然后单击 Next。
后续还有几个步骤,按界面提示操作即可。安装完成后,Eclipse 需要重启,以使 Tomcant4E 插件生效。
重启 Eclipse。
重启后,在 Eclipse 菜单中选择 Run As > Run Configurations。
选择左侧导航选项中的 AliTomcat Webapp,单击上方的 New launch configuration 图标。
在弹出的界面中,选择 AliTomcat 页签,在 taobao-hsf.sar Location 区域单击 Browse,选择本地的 Pandora 路径,如:d:\work\tomcat\deploy\taobao-hsf.sar。
单击 Apply 或 Run,完成设置。
一个工程只需配置一次,下次可直接启动。
运行 IntelliJ IDEA。
从菜单栏中选择 Run > Edit Configuration。
在 Run/Debug Configuration 页面左侧的导航栏中选择 Defaults > Tomcat Server > Local。
配置 AliTomcat。
在右侧页面单击 Server 页签,然后在 Application Server 区域单击 Configure。
在 Application Server 页面右上角单击 +,然后在 Tomcat Server 对话框中设置 Tomcat Home 和 Tomcat base directory 路径,单击 OK。
将 Tomcat Home 的路径设置为本地解压后的 Ali-Tomcat 路径,Tomcat base directory 可以自动使用该路径,无需再设置。
在 Application Server 区域的下拉菜单中,选择刚刚配置好的 Ali-Tomcat。
在 VM Options 区域的文本框中,设置 JVM 启动参数指向 Pandora 的路径,如:-Dpandora.location=d:\work\tomcat\deploy\taobao-hsf.sar
说明:d:\work\tomcat\deploy\taobao-hsf.sar 需要替换为在本地安装 Pandora 的实际路径。
轻量配置中心给开发者提供在开发、调试、测试的过程中的服务发现、注册和查询功能。此模块不属于 EDAS 正式环境中的服务,使用时请下载安装包进行安装。
在一个公司内部,通常只需要在一台机器上安装轻量配置中心服务,并在其他开发机器上绑定特定的 host 即可。具体安装和使用的步骤请参见下文。
确认环境是否达到要求。
正确配置环境变量 JAVA_HOME,指向一个 1.6 或 1.6 以上版本的 JDK。
确认 8080 和 9600 端口未被使用。
由于启动 EDAS 配置中心将会占用此台机器的 8080 和 9600 端口,因此推荐您找一台专门的机器启动 EDAS 配置中心,比如某台测试机器。如果您是在同一台机器上进行测试,请将 Web 项目的端口修改为其它未被占用的端口。
下载 EDAS 配置中心安装包并解压。
如有需要,可以下载历史版本:
2018年10月版本
2018年01月版本
2017年08月版本
2017年07月版本
2017年03月版本
2016年12月版本
进入解压目录(edas-config-center),启动配置中心。
Windows 操作系统:请双击 startup.bat。
Unix 操作系统:请在当前目录下执行 sh startup.sh 命令。
对于需要使用轻量配置中心的开发机器,请在本地 DNS(hosts 文件)中,将 jmenv.tbsite.net 域名指向启动了 EDAS 配置中心的机器 IP。
hosts 文件的路径如下:
Windows 操作系统:C:\Windows\System32\drivers\etc\hosts
Unix 操作系统:/etc/hosts
示例
如果您在 IP 为 192.168.1.100 的机器上面启动了 EDAS 配置中心,则所有开发者只需要在机器的 hosts 文件里加入如下一行即可。
192.168.1.100 jmenv.tbsite.net
绑定轻量配置中心的 host 之后,打开浏览器,在地址栏输入 jmenv.tbsite.net:8080,回车。
即可看到轻量配置中心首页:
如果可以正常显示,说明轻量配置中心配置成功。
如果不能正常显示,请根据之前的步骤一步步排查问题所在。
如果您在配置轻量配置中心过程中遇到问题,请参见轻量配置中心问题进行定位、解决。
为了免于搭建本地配置中心和微服务环境,EDAS 向开发者提供了 IDE 插件。通过一键开启IDE 插件的端云联调功能,即可将本地应用注册到 EDAS 云端注册中心,与云端服务进行通信。
请您参考 Eclipse 联调插件或 Intellij IDEA 联调插件进行安装使用。
本章中介绍的代码均可以通过官方 Demo 获取。
下载 Demo 工程。
解压下载的压缩包,可以看到carshop文件夹,里面包含 itemcenter-api,itemcenter 和 detail 三个 Maven 工程文件夹。
HSF 服务基于接口实现,当接口定义好之后,生产者将使用该接口实现具体的服务,消费者也是基于此接口去订阅服务。
在 Demo 的itemcenter-api工程中,定义了一个服务接口 com.alibaba.edas.carshop.itemcenter.ItemService,内容如下:
public interface ItemService {
public Item getItemById(long id);
public Item getItemByName(String name);
}
该服务接口将提供两个方法:getItemById 与 getItemByName。
生产者将实现服务接口以提供具体服务。同时,由于使用了 Spring 框架,还需要在 .xml 文件中配置服务属性。
说明:Demo 工程中的 itemcenter 文件夹为生产者服务的示例代码。
可以参考ItemServiceImpl.java文件中的示例:
可以参考ItemServiceImpl.java文件中的示例:
package com.alibaba.edas.carshop.itemcenter;
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;
}
}
上述示例主要实现了 com.alibaba.edas.carshop.itemcenter.ItemService,并在两个方法中返回了一个 Item 对象。代码开发完成之后,除了在 web.xml 中进行必要的常规配置,您还需要增加相应的 Maven 依赖,同时在 Spring 配置文件使用 标签注册并发布该服务。具体内容如下:
在pom.xml中添加如下 Maven 依赖:
<dependencies>
<!-- 添加 servlet 的依赖 -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<scope>provided</scope>
</dependency>
<!-- 添加 Spring 的依赖 -->
<dependency>
<groupId>com.alibaba.edas.carshop</groupId>
<artifactId>itemcenter-api</artifactId>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<!-- 添加服务接口的依赖 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>2.5.6(及其以上版本)</version>
</dependency>
<!-- 添加 edas-sdk 的依赖 -->
<dependency>
<groupId>com.alibaba.edas</groupId>
<artifactId>edas-sdk</artifactId>
<version>1.5.0</version>
</dependency>
</dependencies>
在 hsf-provider-beans.xml 文件中增加 Spring 关于 HSF 服务的配置。
<?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 标签表明提供一个服务生产者 -->
<hsf:provider id=“itemServiceProvider"
<!-- 用 interface 属性说明该服务为此类的一个实现 -->
interface=“com.alibaba.edas.carshop.itemcenter.ItemService"
<!-- 此服务具体实现的 Spring 对象 -->
ref=“itemService"
<!-- 发布该服务的版本号,可任意指定,默认为 1.0.0 -->
version=“1.0.0"
</hsf:provider>
</beans>
上面的示例为基本配置,您也可以根据您的实际需求,参考下面的生产者服务属性列表,增加其它配置。
- | - |
---|---|
interface | 必须配置,类型为 [String],为服务对外提供的接口。 |
version | 可选配置,类型为 [String],含义为服务的版本,默认为 1.0.0。 |
clientTimeout | 该配置对接口中的所有方法生效,但是如果客户端通过 methodSpecials 属性对某方法配置了超时时间,则该方法的超时时间以客户端配置为准。其他方法不受影响,还是以服务端配置为准。 |
serializeType | 可选配置,类型为 [String(hessian|java)],含义为序列化类型,默认为 hessian。 |
corePoolSize | 单独针对这个服务设置核心线程池,从公用线程池中划分出来。 |
maxPoolSize | 单独针对这个服务设置线程池,从公用线程池中划分出来。 |
enableTXC | 开启分布式事务 GTS。 |
ref | 必须配置,类型为 [ref],为需要发布为 HSF 服务的 Spring Bean ID。 |
methodSpecials | 可选配置,用于为方法单独配置超时时间(单位 ms),这样接口中的方法可以采用不同的超时时间。该配置优先级高于上面的 clientTimeout 的超时配置,低于客户端的 methodSpecials 配置。 |
<bean id="impl" class="com.taobao.edas.service.impl.SimpleServiceImpl" />
<hsf:provider id="simpleService" interface="com.taobao.edas.service.SimpleService"
ref="impl" version="1.0.1" clientTimeout="3000" enableTXC="true"
serializeType="hessian">
<hsf:methodSpecials>
<hsf:methodSpecial name="sum" timeout="2000" />
</hsf:methodSpecials>
</hsf:provider>
消费者订阅服务从代码编写的角度分为两个部分。
Spring 的配置文件使用标签hsf:consumer/定义好一个 Bean。
在使用的时候从 Spring 的 context 中将 Bean 取出来。
说明:Demo 工程中的 detail 文件夹为消费者服务的示例代码。
与生产者一样,消费者的服务属性配置分为 Maven 依赖配置与 Spring 的配置。
Maven 依赖配置与生产者相同,详情请参见开发生产者服务的配置服务属性。
增加消费者的定义,HSF 框架将根据该配置文件去服务中心订阅所需的服务。
<?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">
<!-- 消费一个服务示例 -->
<hsf:consumer
<!-- Bean ID,在代码中可根据此 ID 进行注入从而获取 consumer 对象 -->
id="item"
<!-- 服务名,与服务提供者的相应配置对应,HSF 将根据 interface + version 查询并订阅所需服务 -->
interface="com.alibaba.edas.carshop.itemcenter.ItemService"
<!-- 版本号,与服务提供者的相应配置对应,HSF 将根据 interface + version 查询并订阅所需服务 -->
version="1.0.0"
</hsf:consumer>
</beans>
可以参考StartListener.java文件中的示例:
public class StartListener implements ServletContextListener{
@Override
public void contextInitialized( ServletContextEvent sce ) {
ApplicationContext ctx = WebApplicationContextUtils.getWebApplicationContext( sce.getServletContext() );
// 根据 Spring 配置中的 Bean ID “item” 获取订阅到的服务
final ItemService itemService = ( ItemService ) ctx.getBean( "item" );
……
// 调用服务 ItemService 的 getItemById 方法
System.out.println( itemService.getItemById( 1111 ) );
// 调用服务 ItemService 的 getItemByName 方法
System.out.println( itemService.getItemByName( "myname is le" ) );
……
}
}
上面的示例中为基本配置,您也可以根据您的实际需求,参考下面的服务属性列表,增加其它配置。
- | - |
---|---|
interface | 必须配置,类型为 [String],为需要调用的服务的接口。 |
version | 可选配置,类型为 [String],为需要调用的服务的版本,默认为1.0.0。 |
methodSpecials | 可选配置,为方法单独配置超时时间(单位 ms)。这样接口中的方法可以采用不同的超时时间,该配置优先级高于服务端的超时配置。 |
target | 主要用于单元测试环境和开发环境中,手动地指定服务提供端的地址。如果不想通过此方式,而是通过配置中心推送的目标服务地址信息来指定服务端地址,可以在消费者端指定 -Dhsf.run.mode=0。 |
connectionNum | 可选配置,为支持设置连接到 server 连接数,默认为1。在小数据传输,要求低延迟的情况下设置多一些,会提升 TPS。 |
clientTimeout | 客户端统一设置接口中所有方法的超时时间(单位 ms)。超时时间设置优先级由高到低是:客户端 methodSpecials,客户端接口级别,服务端 methodSpecials,服务端接口级别 。 |
asyncallMethods | 可选配置,类型为 [List],设置调用此服务时需要采用异步调用的方法名列表以及异步调用的方式。默认为空集合,即所有方法都采用同步调用。 |
maxWaitTimeForCsAddress | 配置该参数,目的是当服务进行订阅时,会在该参数指定时间内,阻塞线程等待地址推送,避免调用该服务时因为地址为空而出现地址找不到的情况。若超过该参数指定时间,地址还是没有推送,线程将不再等待,继续初始化后续内容。注意,在应用初始化时,需要调用某个服务时才使用该参数。如果不需要调用其它服务,请勿使用该参数,会延长启动启动时间。 |
<hsf:consumer id="service" interface="com.taobao.edas.service.SimpleService"
version="1.1.0" clientTimeout="3000"
target="10.1.6.57:12200?_TIMEOUT=1000" maxWaitTimeForCsAddress="5000">
<hsf:methodSpecials>
<hsf:methodSpecial name="sum" timeout="2000" ></hsf:methodSpecial>
</hsf:methodSpecials>
</hsf:consumer>
完成代码、接口开发和服务配置后,在 Eclipse 或 IDEA 中,可直接以 Ali-Tomcat 运行该服务(具体请参照文档开发工具准备中的配置 Eclipse 开发环境和配置 IDEA 开发环境。
在开发环境配置时,有一些额外 JVM 启动参数来改变 HSF 的行为,具体如下:
- | - |
---|---|
-Dhsf.server.port | 指定 HSF 的启动服务绑定端口,默认值为 12200。 |
-Dhsf.serializer | 指定 HSF 的序列化方式,默认值为 hessian。 |
-Dhsf.server.max.poolsize | 指定 HSF 的服务端最大线程池大小,默认值为 600。 |
-Dhsf.server.min.poolsize | 指定 HSF 的服务端最小线程池大小。默认值为 50。 |
-DHSF_SERVER_PUB_HOST | 指定对外暴露的 IP,如果不配置,使用 -Dhsf.server.ip 的值。 |
-DHSF_SERVER_PUB_PORT | 指定对外暴露的端口,该端口必须在本机被监听,并对外开放了访问授权,默认使用 -Dhsf.server.port 的配置,如果 -Dhsf.server.port 没有配置,默认使用 |
在开发调试的过程中,如果您的服务是通过轻量配置中心进行服务注册与发现,就可以通过 EDAS 控制台查询某个应用提供或调用的服务。
假设您在一台 IP 为 192.168.1.100 的机器上启动了 EDAS 配置中心。
进入 http://192.168.1.100:8080/ 。
在左侧菜单栏单击服务列表,输入服务名、服务组名或者 IP 地址进行搜索,查看对应的服务提供者以及服务调用者。
注意:配置中心启动之后默认选择第一块网卡地址做为服务发现的地址,如果开发者所在的机器有多块网卡的情况,可设置启动脚本中的 SERVER_IP 变量进行显式的地址绑定