![Build Status](https://camo.githubusercontent.com/2254aa62fc24019aa42516f9e790b4c809c49a87104e2ba6d10d3d5c7bf5f457/68747470733a2f2f7472617669732d63692e6f72672f66656e676a69616368756e2f4a7570697465722e7376673f6272616e63683d6d6173746572)
Jupiter:
- Jupiter是一款性能非常不错的, 轻量级的分布式服务框架
Jupiter Architecture:
═ ═ ═▷ init ─ ─ ─ ▷ async ──────▶ sync
----------------------------------------------------------------------------------------
┌ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─
┌ ─ ─ ─ ┐ │
─ ─ ─ ─ ─ ─ ─ ─ ─│ Registry Monitor ───────────────────────────┐
│ └ ─ ─ ─ ┘ │ │
└ ─ ─△─ ─ ─ ─ ─△─ ─ ─ ▼
│ ┌ ─ ─ ─ ─
Notify ║ ║ Telnet │
│ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ └ ─ ─ ─ ─
║ ║ ▲
│ Subscribe Register │
║ ║ │
│ ┌ ─ ─ ─ ─ ─ ┌ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ │
│─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ▷ ┌ ─ ─ ─ ┐ │ │
└ ▷│ Consumer Invoke │ Provider Monitor ─────┘
│────────────────────────▶ └ ─ ─ ─ ┘ │
└ ─ ─ ─ ─ ─ └ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─
---------------------------------------------------------------------------------------
性能:
- 小数据包请求(不带业务)在四核刀片服务器上可达到17w+的tps, 详情见 Benchmark
文档:
快速入门:
工程依赖:
- JDK1.7或更高版本
- 依赖管理工具: Maven3.x版本
Maven依赖:
<properties>
<jupiter.version>1.2.6</jupiter.version>
</properties>
<dependency>
<groupId>org.jupiter-rpc</groupId>
<artifactId>jupiter-rpc</artifactId>
<version>${jupiter.version}</version>
</dependency>
<!-- 传输层 -->
<dependency>
<groupId>org.jupiter-rpc</groupId>
<artifactId>jupiter-transport-netty</artifactId>
<version>${jupiter.version}</version>
</dependency>
<!-- 序列化/反序列化, 可选择只其中依赖一种或者同时依赖多种 -->
<dependency>
<groupId>org.jupiter-rpc</groupId>
<artifactId>jupiter-serialization-hessian</artifactId>
<version>${jupiter.version}</version>
</dependency>
<dependency>
<groupId>org.jupiter-rpc</groupId>
<artifactId>jupiter-serialization-java</artifactId>
<version>${jupiter.version}</version>
</dependency>
<dependency>
<groupId>org.jupiter-rpc</groupId>
<artifactId>jupiter-serialization-kryo</artifactId>
<version>${jupiter.version}</version>
</dependency>
<dependency>
<groupId>org.jupiter-rpc</groupId>
<artifactId>jupiter-serialization-protostuff</artifactId>
<version>${jupiter.version}</version>
</dependency>
<!-- 注册中心, jupiter-registry-zookeeper/jupiter-registry-default二选一 -->
<dependency>
<groupId>org.jupiter-rpc</groupId>
<artifactId>jupiter-registry-default</artifactId>
<version>${jupiter.version}</version>
</dependency>
<!-- 集成Spring支持, 如不集成Spring可不依赖 -->
<dependency>
<groupId>org.jupiter-rpc</groupId>
<artifactId>jupiter-spring-support</artifactId>
<version>${jupiter.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.3.0.RELEASE</version>
</dependency>
<!-- telnet监控模块(可选) -->
<dependency>
<groupId>org.jupiter-rpc</groupId>
<artifactId>jupiter-monitor</artifactId>
<version>${jupiter.version}</version>
</dependency>
<!-- flightexec(可选) -->
<dependency>
<groupId>org.jupiter-rpc</groupId>
<artifactId>jupiter-flightexec</artifactId>
<version>${jupiter.version}</version>
</dependency>
简单调用示例:
1. 创建服务接口:
@ServiceProvider(group = "test", name = "serviceTest")
public interface ServiceTest {
String sayHelloString();
}
@ServiceProvider:
- 建议每个服务接口通过此注解来指定服务信息, 如不希望业务代码对jupiter依赖也可以不使用此注解而手动去设置服务信息
+ group: 服务组别(选填, 默认组别为'Jupiter')
+ name: 服务名称(选填, 默认名称为接口全限定名称)
2. 创建服务实现:
@ServiceProviderImpl(version = "1.0.0")
public class ServiceTestImpl implements ServiceTest {
@Override
public String sayHelloString() {
return "Hello jupiter";
}
}
@ServiceProviderImpl:
- 建议每个服务实现通过此注解来指定服务版本信息, 如不希望业务代码对jupiter依赖也可以不使用此注解而手动去设置版本信息
+ version: 服务版本号(选填, 默认版本号为'1.0.0')
3. 启动注册中心:
- 选择1: 使用jupiter默认的注册中心:
public class HelloJupiterRegistryServer {
public static void main(String[] args) {
// 注册中心
RegistryServer registryServer = RegistryServer.Default.createRegistryServer(20001, 1);
try {
registryServer.startRegistryServer();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
默认注册中心只建议在测试环境使用, 线上建议使用zookeeper实现
在server和client中配置jupiter-registry-zookeeper依赖并去除jupiter-registry-default依赖即可, 无需其他改动
<dependency>
<groupId>org.jupiter-rpc</groupId>
<artifactId>jupiter-registry-zookeeper</artifactId>
<version>${jupiter.version}</version>
</dependency>
4. 启动服务提供(Server):
public class HelloJupiterServer {
public static void main(String[] args) throws Exception {
JServer server = new DefaultServer().withAcceptor(new JNettyTcpAcceptor(18090));
// provider
ServiceTestImpl service = new ServiceTestImpl();
// 本地注册
ServiceWrapper provider = server.serviceRegistry()
.provider(service)
.register();
// 连接注册中心
server.connectToRegistryServer("127.0.0.1:20001");
// 向注册中心发布服务
server.publish(provider);
// 启动server
server.start();
}
}
5. 启动服务消费者(Client)
public class HelloJupiterClient {
public static void main(String[] args) {
JClient client = new DefaultClient().withConnector(new JNettyTcpConnector());
// 连接RegistryServer
client.connectToRegistryServer("127.0.0.1:20001");
// 自动管理可用连接
JConnector.ConnectionWatcher watcher = client.watchConnections(ServiceTest.class);
// 等待连接可用
if (!watcher.waitForAvailable(3000)) {
throw new ConnectFailedException();
}
ServiceTest service = ProxyFactory.factory(ServiceTest.class)
.version("1.0.0")
.client(client)
.newProxyInstance();
service.sayHelloString();
}
}
Server/Client代码示例
结合Spring使用示例:
<jupiter:server id="jupiterServer">
<jupiter:property registryServerAddresses="127.0.0.1:20001" />
</jupiter:server>
<!-- provider -->
<bean id="serviceTest" class="org.jupiter.example.ServiceTestImpl" />
<jupiter:provider id="serviceTestProvider" server="jupiterServer" providerImpl="serviceTest">
<jupiter:property weight="100"/>
</jupiter:provider>
<jupiter:client id="jupiterClient">
<jupiter:property registryServerAddresses="127.0.0.1:20001" />
</jupiter:client>
<!-- consumer -->
<jupiter:consumer id="serviceTest" client="jupiterClient" interfaceClass="org.jupiter.example.ServiceTest">
<jupiter:property version="1.0.0.daily" />
<jupiter:property serializerType="proto_stuff" />
<jupiter:property loadBalancerType="round_robin" />
<jupiter:property timeoutMillis="3000" />
<jupiter:property clusterStrategy="fail_over" />
<jupiter:property failoverRetries="2" />
<jupiter:methodSpecials>
<!-- 方法的单独配置 -->
<jupiter:methodSpecial methodName="sayHello" timeoutMillis="5000" clusterStrategy="fail_fast" />
</jupiter:methodSpecials>
</jupiter:consumer>
SpringServer/SpringClient代码示例
其他