cd isuwang-soa-container
sh dev.sh
isuwang-soa-container/target/isuwang-soa-container
|-- isuwang-soa-container
| |-- bin
| | |-- lib 平台jar包目录
| | | |-- isuwang-soa-container.jar
| | | |-- ...
| | |-- startup.sh
| | |-- shutdown.sh
| | |-- isuwang-soa-bootstrap.jar
| |-- lib 公共依赖jar包目录
| | |-- isuwang-soa-core.jar
| | |-- ...
| |-- conf 配置文件目录
| | |-- server-conf.xml
| | |-- logback.xml
| |-- apps 服务目录
| | |-- service-a/*.jar
| | |-- service-b.jar
| | |-- service-c_d_f.jar
| | |-- service-e/classes
| |-- logs 日志目录
-------------------------------------------------------
|-- isuwang-soa
| |-- isuwang-soa-api-doc 服务api站点工程
| |-- isuwang-soa-bootstrap 启动模块工程
| |-- isuwang-soa-code-generator 服务idl代码生成工程
| |-- isuwang-soa-container 容器工程
| |-- isuwang-soa-core 核心工程
| |-- isuwang-soa-maven-plugin Maven开发插件工程
| |-- isuwang-soa-monitor
| | |-- isuwang-soa-monitor-api 监控模块api工程
| | |-- isuwang-soa-monitor-druid druid的监控工具
| | |-- isuwang-soa-monitor-influxdb 监控模块api实现工程(influxdb版本)
| |-- isuwang-soa-registry
| | |-- isuwang-soa-registry-api 注册模块api工程
| | |-- isuwang-soa-registry-zookeeper 注册模块api实现工程(zookeeper版本)
| |-- isuwang-soa-remoting
| | |-- isuwang-soa-remoting-api 客户端通讯模块api工程
| | |-- isuwang-soa-remoting-netty 客户端通讯模块api实现工程(netty版本)
| | |-- isuwang-soa-remoting-socket 客户端通讯模块api实现工程(socket版本)
| |-- isuwang-soa-spring spring扩展模块工程
mvn clean install
git clone https://github.com/isuwang/isuwang-soa-hello.git
- hello_domain.thrift:
namespace java com.isuwang.soa.hello.domain
struct Hello {
1: string name,
2: optional string message
}
- hello_service.thrift:
include "hello_domain.thrift"
namespace java com.isuwang.soa.hello.service
/**
* Hello Service
**/
service HelloService {
/**
* say hello
**/
string sayHello(1:string name),
string sayHello2(1:hello_domain.Hello hello)
}
打包服务接口代码工程(
isuwang-soa-code-generator
):mvn clean package
输出的可执行jar包目录:
isuwang-soa-code-generator/target/isuwang-soa-code-generator-1.0-SNAPSHOT-jar-with-dependencies.jar
打印帮助命令
java -jar isuwang-soa-code-generator-1.0-SNAPSHOT-jar-with-dependencies.jar
-----------------------------------------------------------------------
args: -gen metadata,js,json file
Scrooge [options] file
Options:
-out dir Set the output location for generated files.
-gen STR Generate code with a dynamically-registered generator.
STR has the form language[val1,val2,val3].
Keys and values are options passed to the generator.
Available generators (and options):
metadata
js
json
java
-----------------------------------------------------------------------
生成thrift idl 定义服务接口代码
java -jar isuwang-soa-code-generator-1.0-SNAPSHOT-jar-with-dependencies.jar -gen java -out F:\hello F:\hello\hello_domain.thrift,F:\hello\hello_service.thrift
# 说明:
# 1. `-gen java` 表示生成java代码;
# 2. `-out F:\hello`表示生成代码到`F:\hello`文件夹;
# 3. 多个thrift文件使用`,`分隔;
# 4. 生成的xml文件在`F:\hello`文件夹,java类在`F:\hello\java-gen`文件夹。
hello-api
工程会被服务端和客户端依赖。
新建maven工程,即hello-api
工程,依赖于isuwang-soa-remoting-api
:
<dependency>
<groupId>com.isuwang</groupId>
<artifactId>isuwang-soa-remoting-api</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
将上一步中生成的java代码,拷贝入对应的package。将上一步中生成的xml文件,拷贝入resources
文件夹。示例如图:
最后mvn clean install
此项目。
hello-service
工程依赖于hello-api
工程和isuwang-soa-spring
包,在工程中实现api中的接口类,在方法中实现具体的业务逻辑。
- 依赖:
<dependency>
<groupId>com.isuwang</groupId>
<artifactId>isuwang-soa-hello-api</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.isuwang</groupId>
<artifactId>isuwang-soa-spring</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
- 实现类:
public class HelloServiceImpl implements HelloService {
@Override
public String sayHello(String name) throws SoaException {
return "hello, " + name;
}
@Override
public String sayHello2(Hello hello) throws SoaException {
if (hello.getName().equals("bad")) {
throw new SoaException("hello-001", "so bad");
} else {
String message;
if (!hello.getMessage().isPresent())
message = "you message is emtpy";
else
message = "you message is '" + hello.getMessage().get() + "'";
return "hello, " + hello.getName() + ", " + message;
}
}
}
- 声明服务,使得容器启动时加载和注册该服务:
在resources/META-INF/spring/
文件夹下新建services.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:soa="http://soa-springtag.isuwang.com/schema/service"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://soa-springtag.isuwang.com/schema/service
http://soa-springtag.isuwang.com/schema/service/service.xsd">
<bean id="helloService" class="com.isuwang.soa.hello.HelloServiceImpl"/>
<soa:service ref="helloService"/>
</beans>
前提:需要把
isuwang-soa-maven-plugin
安装到本地maven仓库
安装isuwang-soa-maven-plugin
工程
- 源码手动安装
cd isuwang-soa/isuwang-soa-maven-plugin
mvn clean install
启动服务容器在开发模式下可以选择
本地模式
或远程模式
可在无开发ide环境下或在ide开发环境下运行
可以使用
isuwangsoa
的插件简称,需要在本地maven进行配置
- isuwangsoa插件简称配置(不使用不用配置)
修改maven的主配置文件(${MAVEN_HOME}/conf/settings.xml文件或者 ~/.m2/settings.xml文件)
<pluginGroups>
<pluginGroup>com.isuwang</pluginGroup>
</pluginGroups>
- 本地模式(无需启动zookeeper)
默认启动端口:9090
启动命令:
# 第一种(简称)
cd hello-service
mvn compile isuwangsoa:run -Dsoa.remoting.mode=local
# 第二种
cd hello-service
mvn compile com.isuwang:isuwangsoa-maven-plugin:1.0-SNAPSHOT:run -Dsoa.remoting.mode=local
- 远程模式(需要启动zookeeper)
默认启动端口:9090
启动命令:
# 第一种(简称)
cd hello-service
mvn compile isuwangsoa:run
# 第二种
cd hello-service
mvn compile com.isuwang:isuwangsoa-maven-plugin:1.0-SNAPSHOT:run
- 启动可选参数
# -Dsoa.zookeeper.host=127.0.0.1:2181
# -Dsoa.container.port=9090
# -Dsoa.monitor.enable=false
客户端要依赖hello-api
,isuwang-soa-registry-zookeeper
和isuwang-soa-remoting-netty
<dependency>
<groupId>com.isuwang</groupId>
<artifactId>isuwang-soa-hello-api</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.isuwang</groupId>
<artifactId>isuwang-soa-registry-zookeeper</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.isuwang</groupId>
<artifactId>isuwang-soa-remoting-netty</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
非本地模式不用配置
启动参数:
# -Dsoa.remoting.mode=local
可选参数:
# -Dsoa.service.port=9091
无必选参数
可选参数:
# -Dsoa.zookeeper.host=127.0.0.1:2181
# -Dsoa.service.port=9091
测试代码:
HelloServiceClient client = new HelloServiceClient();
System.out.println(client.sayHello("LiLei"));
- 启动服务后,在浏览器访问地址:http://localhost:8080/index.htm,点击
api
标签,即可看到当前运行的服务信息:
- 点击对应服务,可以查看该服务相关信息,包括全名称、版本号、方法列表、结构体和枚举类型列表等,点击对应项目可查看详情。
- 从方法详情页面点击在线测试,进入在线测试页面:
- 输入必填项参数,点击提交请求,即可请求本机当前运行的服务,并获得返回数据:
- 控制台可以看到相应的请求信息:
其中trans-pool-1-thread-2是后台服务打印日志
-
请求发送和结果返回前,将对实体中所有非Optional类型字段进行校验,若不为Optional类型且为
null
,将直接抛错;struct描述时,若字段类型为optional,则在生成java代码时,该字段将会被转为Optional类型,请求发送和结果返回时,不再对该字段做判空校验,例:
/** * 文章来源 */ 6: optional string source,
-
在struct描述中,若字段类型为
i64
,且注释中包含@datatype(name="date")
字符串, 则在java代码生成时,该字段将自动转换为java.util.Date
类型,例:/** * @datatype(name="date") **/ 8: i64 createdAt,
-
在method描述中,如果参数类型为
i64
,且注释中包含@datatype(name="date")
字符串,则在java代码生成时,该参数将自动转换为java.util.Date
类型,例:service HelloService { /** * @datatype(name="date") **/ i64 sayHello(/**@datatype(name="date")**/1:i64 updateAt, /**@datatype(name="bigdecimal")**/2:double amount), }
-
在method描述中,若返回结果类型为
i64
,且注释中包含@datatype(name="date")
字符串,则在java代码生成时,该返回结果将自动转换为java.util.Date
类型,例子同上。
-
在struct描述中,若字段类型为
double
,且注释中包含@datatype(name="bigdecimal")
字符串, 则在java代码生成时,该字段将自动转换为java.math.BigDecimal
类型,例:/** * @datatype(name="bigdecimal") **/ 1: doublle amount,
-
在method描述中,如果参数类型为
double
,且注释中包含@datatype(name="bigdecimal")
字符串,则在java代码生成时,该参数将自动转换为java.math.BigDecimal
类型,例:service HelloService { /** * @datatype(name="bigdecimal") **/ double sayHello(/**@datatype(name="date")**/1:i64 updateAt, /**@datatype(name="bigdecimal")**/2:double amount), }
-
在method描述中,若返回结果类型为
double
,且注释中包含@datatype(name="bigdecimal")
字符串,则在java代码生成时,该返回结果将自动转换为java.math.Bigdecimal
类型,例子同上。
-
框架默认打印所有请求内容和返回内容,若不想打印某字段,可以在struct描述时,在该字段注释中添加
@logger(level="off")
字符串,例:/** * @logger(level="off") * 文章内容,不打印 */ 5: optional string content,