═ ═ ═▷ init ─ ─ ─ ▷ async ──────▶ sync
----------------------------------------------------------------------------------------
┌ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─
┌ ─ ─ ─ ┐ │
─ ─ ─ ─ ─ ─ ─ ─ ─│ Registry Monitor ───────────────────────────┐
│ └ ─ ─ ─ ┘ │ │
└ ─ ─△─ ─ ─ ─ ─△─ ─ ─ ▼
│ ┌ ─ ─ ─ ─
Notify ║ ║ Telnet │
│ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ └ ─ ─ ─ ─
║ ║ ▲
│ Subscribe Register │
║ ║ │
│ ┌ ─ ─ ─ ─ ─ ┌ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ │
│─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ▷ ┌ ─ ─ ─ ┐ │ │
└ ▷│ Consumer Invoke │ Provider Monitor ─────┘
│────────────────────────▶ └ ─ ─ ─ ┘ │
└ ─ ─ ─ ─ ─ └ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─
---------------------------------------------------------------------------------------
<properties>
<jupiter.version>1.2.4</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>
创建服务接口:
@ServiceProvider(group = "test", name = "serviceTest") public interface ServiceTest { String sayHelloString(); }
@ServiceProvider:
- 建议每个服务接口通过此注解来指定服务信息, 如不希望业务代码对jupiter依赖也可以不使用此注解而手动去设置服务信息
- group: 服务组别(选填, 默认组别为'Jupiter')
- name: 服务名称(选填, 默认名称为接口全限定名称)
创建服务实现:
@ServiceProviderImpl(version = "1.0.0") public class ServiceTestImpl implements ServiceTest { @Override public String sayHelloString() { return "Hello jupiter"; } }
@ServiceProviderImpl:
- 建议每个服务实现通过此注解来指定服务版本信息, 如不希望业务代码对jupiter依赖也可以不使用此注解而手动去设置版本信息
- version: 服务版本号(选填, 默认版本号为'1.0.0')
启动注册中心:
选择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(); } } }
选择2: 使用zookeeper作为注册中心:
默认注册中心只建议在测试环境使用, 线上建议使用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>
启动服务提供(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(); } }
启动服务消费者(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(); } }
<bean id="server" class="org.jupiter.spring.support.JupiterSpringServer"> <!-- 注册中心地址, 逗号分隔 --> <property name="registryServerAddresses" value="127.0.0.1:20001" /> </bean> <!-- provider --> <bean id="serviceTest" class="org.jupiter.example.ServiceTestImpl" /> <bean class="org.jupiter.spring.support.JupiterSpringProviderBean"> <property name="server" ref="server" /> <property name="providerImpl" ref="serviceTest" /> </bean>
<bean id="client" class="org.jupiter.spring.support.JupiterSpringClient"> <!-- 注册中心地址, 逗号分隔 --> <property name="registryServerAddresses" value="127.0.0.1:20001" /> </bean> <!-- consumer --> <bean id="serviceTest" class="org.jupiter.spring.support.JupiterSpringConsumerBean"> <property name="client" ref="client" /> <property name="interfaceClass" value="org.jupiter.example.ServiceTest" /> <!-- 以下都选项可不填 --> <!-- 服务版本号, 通常在接口不兼容时版本号才需要升级 --> <property name="version" value="1.0.0" /> <property name="serializerType" value="proto_stuff" /> </bean>