1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/cc_1234-java-groupco-rpc

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
В этом репозитории не указан файл с открытой лицензией (LICENSE). При использовании обратитесь к конкретному описанию проекта и его зависимостям в коде.
Клонировать/Скачать
README.md 8.3 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
Отправлено 28.02.2025 01:16 71f422f

GroupCo-java

Основные характеристики

  • Поддержка вызова внутренних сервисов
  • Поддержка клиентских вызовов GroupCo
  • Поддержка регистрации центра Redis, открытия и регистрации сервисов
  • Клиентское кэширование
  • Грациозное завершение работы сервиса
  • Переключение при сбое (в процессе выполнения)

Предоставление сервиса

Определение сервисного интерфейса

DemoService.java

package co.demo.server;

import co.server.annotation.Param;

public interface DemoService {
    String sayHello(@Param("name") String name);
}

Реализация интерфейса в стороне предоставления сервиса

DemoServiceImpl

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 version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:redisson="http://redisson.org/schema/redisson"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://redisson.org/schema/redisson http://redisson.org/schema/redisson/redisson.xsd">

    <context:component-scan base-package="co.demo.server"/>
    <context:component-scan base-package="co.server"/>
    <bean id="ApplicationContextUtil" class="co.server.context.ApplicationContextUtil"></bean>

    <bean id="groupCoServer" class="co.server.CoServer">
        <property name="serviceName" value="Demo"/>
        <property name="port" value="8099"/>
        <!-- Открытые сервисы -->
        <property name="services">
            <map>
                <entry key="demoService">
                    <map>
                        <entry key="interface" value="co.demo.server.DemoService"/>
                    </map>
                </entry>
            </map>
        </property>
    </bean>
    
    <!-- Использование Redis как центральной точки регистрации -->
    <redisson:client id="coRedissonClient" codec-ref="codec">
        <redisson:single-server address="redis://127.0.0.1:6379"/>
    </redisson:client>
    <bean id="codec" class="org.redisson.client.codec.StringCodec"/>
    <bean id="redisKeyUtil"
          class="co.server.common.util.RedisKeyUtil">
        <property name="prefix" value="demo"></property>
    </bean>
</beans>

Загрузка конфигурации Spring

ServiceProvider.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("Сервис запущен...");
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("classpath:app.xml");
        context.start();
    }
}

Конечный потребитель сервиса

Указание удаленного сервиса через конфигурацию Spring

<?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:context="http://www.springframework.org/schema/context"
       xmlns:redisson="http://redisson.org/schema/redisson"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://redisson.org/schema/redisson http://redisson.org/schema/redisson/redisson.xsd">

    <context:component-scan base-package="co.server"/>
    <bean id="ApplicationContextUtil" class="co.server.context.ApplicationContextUtil"></bean>

    <bean id="groupCoServer" class="co.server.CoServer">
        <property name="serviceName" value="DemoClient"/>
        <property name="port" value="8098"/>
        <!-- Зависящие сервисы -->
        <property name="references">
            <map>
                <entry key="demoService">
                    <map>
                        <entry key="serverName" value="Demo"></entry>
                        <entry key="interface" value="co.demo.server.DemoService"/>
                    </map>
                </entry>
            </map>
        </property>
    </bean>

    <redisson:client id="coRedissonClient" codec-ref="codec">
        <redisson:single-server address="redis://127.0.0.1:6379"/>
    </redisson:client>
    <bean id="codec" class="org.redisson.client.codec.StringCodec"/>
    <bean id="redisKeyUtil"
          class="co.server.common.util.RedisKeyUtil">
        <property name="prefix" value="demo"></property>
    </bean>
</beans>

Загрузка конфигурации Spring и вызов удаленного сервиса

Consumer.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

Использование TCP-клиента Group-Co для вызова сервиса

Установите параметры в config/app.php
        'protocol' => 'buf',
        // Формат пакета данных json, serialize
        'pack' => 'json',
        // Активировать gzip-сжатие true, false
        'gzip' => false,
Вызов сервиса через сервис-центр
    $service = (yield service_center('Demo'));
    $res = (yield $service->call("Demo::sayHello", ['name' => 'world']));
    dump($res);
Асинхронный вызов через TCP-клиент
    $tcp = new AsyncTcp('127.0.0.1', 8099);
    $res = (yield $tcp->call(['cmd' => 'Demo\\Demo::sayHello', 'data' => ['name' => 'world']]));

    // Будет возвращено
    // {"cmd":"Demo\\Demo::sayHello","code":200,"data":"Hello world","type":"json","version":"1.0.0"}

Вызовы через клиента Swoole

    <?php

    $client = new Swoole\Client(SWOOLE_SOCK_TCP, SWOOLE_SOCK_ASYNC);
    $client->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 "Получено: ".$data."\n";
    });
    $client->on("error", function($cli){
        echo "Подключение не удалось\n";
    });
    $client->on("close", function($cli){
        echo "Соединение закрыто\n";
    });

    $client->connect('127.0.0.1', 8099, 0.5);

Опубликовать ( 0 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/cc_1234-java-groupco-rpc.git
git@api.gitlife.ru:oschina-mirror/cc_1234-java-groupco-rpc.git
oschina-mirror
cc_1234-java-groupco-rpc
cc_1234-java-groupco-rpc
master