# 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);
```