Легковесный, высокопроизводительный и удобный в использовании фреймворк RPC, использующий gRPC для коммуникации. Поддерживает SpringBoot и включает в себя функции управления сервисами, такие как регистрация и обнаружение сервисов, балансировка нагрузки, ограничение по количеству запросов, отказоустойчивость и другие. Цель проекта — помочь разработчикам Java получить опыт разработки, близкий к работе с локальными сервисами, и использовать легковесный, но высокопроизводительный фреймворк RPC.#### Описание проекта
Возможность использования gRPC без необходимости создания файлов protobuf, простой и удобный API, минимальная дополнительная конфигурация, что обеспечивает опыт разработки, близкий к работе с монолитными проектами.
Использование gRPC для сетевой коммуникации и protobuf для сериализации данных, что обеспечивает высокую производительность.
Абстрактные модули с сильной расширяемостью.
Использование Zookeeper в качестве центра регистрации, что обеспечивает функции регистрации и обнаружения сервисов, поддержка кэширования адресов сервисов на стороне клиента, реальное время отслеживание подключения и отключения сервисов.
Удобное аннотированное программирование на основе SpringBoot, а также возможность работы без использования фреймворка.
Поддержка синхронного, асинхронного и обобщенного вызова.
Поддержка балансировки нагрузки на стороне клиента, реализованы случайная балансировка нагрузки с весами, алгоритм консистентного хэширования, возможность настройки пользовательского алгоритма балансировки нагрузки. Возможность указания адреса сервиса для вызова, обход центра регистрации.
Максимальное время ожидания вызова на стороне клиента, повторные попытки при превышении времени ожидания.
Поддержка ограничения по количеству запросов на уровне интерфейса и метода на стороне сервера. 10.Поддержка цепочки фильтров на стороне сервера и клиента, возможность подключения пользовательских фильтров, расширяемость.
Предоставление механизма отказоустойчивости, включающего быстрое отключение, повторные попытки, отказоустойчивость и другие стратегии, возможность настройки пользовательской стратегии отказоустойчивости.
Использование локального метода мокирования при неудачном вызове на стороне клиента.
Предоставление механизма контекста, что позволяет передавать параметры между поставщиками и потребителями сервиса.
Поддержка механизма токенов, что позволяет клиенту вызывать сервисы с использованием токенов.
Отслеживание цепочки вызовов с помощью traceId.
Грациозное запуск сервиса, задержка регистрации сервиса в центре регистрации после запуска, что предотвращает внезапное появление большого объема трафика.
Грациозное завершение работы сервиса, отклонение новых запросов при отключении или перезапуске сервиса, завершение обработки текущих запросов перед закрытием сервера, что предотвращает неудачное завершение обработки запросов.
Автоматическое удаление адресов удаленных сервисов из кэша клиента при достижении порогового значения неудачных запросов.#### Инструкция по установке
mvn compile
mvn install
В свой проект добавьте зависимость в файл pom.xml
<dependency>
<groupId>com.weizhu</groupId>
<artifactId>swufer-core</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
Сервис-поставщик
@SwuferService //Добавьте аннотацию к реализующему классу для регистрации сервиса
public class DemoServiceImpl implements DemoService {
@Override
public String hello(String name) {
return "hello from " + name;
}
}
Сервис-поставщик, запуск проекта
@SpringBootApplication
@EnableSwuferAutoStart //Добавьте эту аннотацию для автоматического запуска RPC-сервера
public class App {
public static void main(String[] args) throws InterruptedException {
SpringApplication.run(App.class, args);
new CountDownLatch(1).await();
}
}
Сервис-поставщик, конфигурация application.yml
swufer:
rpc:
registryType: zookeeper
registryAddress: 127.0.0.1:2181 #адрес zookeeper
port: 8001 #порт grpc-сервера
weight: 100 #вес сервиса
Сервис-потребитель
@RestController
public class ConsumerController {
@SwuferReference //Добавьте эту аннотацию для прямого внедрения агента
DemoService demoService;
@SwuferReference //Добавьте эту аннотацию для прямого внедрения агента обобщенного вызова
GenericService genericService;
private static final int nThread = 30;
private static final ExecutorService pool = Executors.newFixedThreadPool(nThread);
@RequestMapping("test/hello")
public String testSync(@RequestParam("name") String name) throws ExecutionException, InterruptedException {
return demoService.hello(name);
}
``` @RequestMapping("test/generic")
public String testGeneric(@RequestParam("name") String name){
try {
return (String) genericService.$invoke("com.weizhu.swufer.api.demo.DemoService", "hello",
"generic_test");
} catch (RpcException e) {
return e.getCode() + e.getMessage();
}
}
}
Сервис-потребитель, конфигурация application.yml
swufer:
rpc:
registryType: zookeeper
registryAddress: 127.0.0.1:2181
# cluster: FailBackMockCluster
# loadBalancer: RandomLoadBalancer
server:
port: 8080
```**Использование gRPC-сервиса на SpringBoot с помощью нескольких аннотаций и конфигураций**
##### 2. Вызов без использования фреймворка Java
Серверная часть:
public static void testService() throws IOException {
//registry: адрес Zookeeper
//port: порт gRPC-коммуникации
//scanRpcService: путь к пакету, содержащему классы с аннотацией @SwuferService
SwuferBootstrap bootstrap = SwuferBootstrap.newBuilder().registry("127.0.0.1:2181")
.port(8001).scanRpcService("com.weizhu.swufer.testprovider.demo").buildBootstrap();
//Запуск сервера
bootstrap.start();
new CountDownLatch(1).await();
}
Клиентская часть:
public class UnitTest {
private static SwuferBootstrap bootstrap = SwuferBootstrap.newBuilder().registry("127.0.0.1:2181")
.buildBootstrap();
public static void main(String[] args) {
testProxy();
}
public static void testProxy(){
ReferenceConfig config = ReferenceConfig.ref(DemoService.class);
DemoService reference = (DemoService) bootstrap.getReference(config);
String result = reference.hello("hello from swufer");
System.out.println(result);
}
}
#### Участие в проекте
1. Fork этого репозитория
2. Создайте ветку Feat_xxx
3. Подайте Pull Request
#### Фичи1. Используйте Readme_XXX.md для поддержки различных языков, например Readme_en.md, Readme_zh.md
2. Официальный блог Gitee [blog.gitee.com](https://blog.gitee.com)
3. Вы можете [https://gitee.com/explore](https://gitee.com/explore) для просмотра лучших проектов на Gitee
4. [GVP](https://gitee.com/gvp) — это Gitee Most Valuable Open Source Project, лучшие проекты, оцененные по определенным критериям
5. Официальная документация Gitee [https://gitee.com/help](https://gitee.com/help)
6. Секция Gitee Stars для представления лучших участников Gitee [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/)
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Опубликовать ( 0 )