# GroupCo-java **Repository Path**: cc_1234/java-groupco-rpc ## Basic Information - **Project Name**: GroupCo-java - **Description**: GroupCo基础服务提供者,java版本.可以与GroupCo服务层无缝切换 - **Primary Language**: Java - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 10 - **Forks**: 2 - **Created**: 2018-03-14 - **Last Updated**: 2020-12-19 ## Categories & Tags **Categories**: microservice **Tags**: None ## README ### GroupCo-java ### 特性 - 支持内部服务调用 - 支持GroupCo的客户端调用 - 支持redis注册中心、服务的发现与注册 - 客户端缓存 - 服务优雅停机 - 故障切换(todo) ### 服务提供方 #### 定义服务接口 DemoService.java ```java package co.demo.server; import co.server.annotation.Param; public interface DemoService { String sayHello(@Param("name") String name); } ``` #### 在服务提供方实现接口 DemoServiceImpl ```java package co.demo.server; import co.server.annotation.Param; import org.springframework.stereotype.Service; @Service("demoService") public class DemoServiceImpl implements DemoService { public String sayHello(@Param("name") String name) { return "Hello " + name; } } ``` #### 用 Spring 配置声明暴露服务 app.xml ```xml ``` #### 加载 Spring 配置 ServiceProvider.java ```java import co.server.CoServer; import org.springframework.context.support.ClassPathXmlApplicationContext; public class ServiceProvider { public static void main(String[] args) throws Exception { System.out.println("service starting..."); ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("classpath:app.xml"); context.start(); } } ``` ### 服务消费者 #### 通过 Spring 配置引用远程服务 ```xml ``` #### 加载Spring配置,并调用远程服务 Consumer.java ```java import co.demo.server.DemoService; import co.server.CoServer; import co.server.Services; import org.springframework.context.support.ClassPathXmlApplicationContext; public class Consumer { public static void main(String[] args) throws Exception { ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("classpath:app.xml"); context.start(); DemoService demoService = Services.getBean("demoService"); String hello = demoService.sayHello("world"); // 执行远程方法 System.out.println( hello ); // 显示调用结果 } } ``` ### PHP调用 #### 使用Group-Co框架的Tcp客户端调用 ##### 注意设置config/app.php中 ```php 'protocol' => 'buf', //包体的打包方式json,serialize 'pack' => 'json', //是否启用gzip压缩true,false 'gzip' => false, ``` ##### 使用service_center()服务中心调用 ```php $service = (yield service_center('Demo')); $res = (yield $service->call("Demo::sayHello", ['name' => world])); dump($res); ``` ##### 使用异步TCP客户端调用 ```php $tcp = new AsyncTcp('127.0.0.1', 8099); $res = (yield $tcp->call(['cmd' => 'Demo\\Demo::sayHello', 'data' => ['name' => 'world']])); //it will return //{"cmd":"Demo\\Demo::sayHello","code":200,"data":"Hello world","type":"json","version":"1.0.0"} ``` #### 使用swoole客户端调用 ```php set(array( 'open_length_check' => true, 'package_length_type' => 'N', 'package_max_length' => 2000000, 'package_length_offset' => 0, 'package_body_offset' => 4, )); $client->on("connect", function($cli) { $cmd = "Demo\\Demo::sayHello"; $data = array('name' => 'world'); $bin_body = pack("a*", json_encode(['cmd' => $cmd, 'data' => $data])); $body_len = strlen($bin_body); $bin_head = pack("N", $body_len); $bin_data = $bin_head . $bin_body; $cli->send($bin_data); }); $client->on("receive", function($cli, $data){ $data = substr($data, 4); echo "Received: ".$data."\n"; }); $client->on("error", function($cli){ echo "Connect failed\n"; }); $client->on("close", function($cli){ echo "Connection close\n"; }); $client->connect('127.0.0.1', 8099, 0.5); ```