Функция dubbo очень совершенна, во многих случаях нам не нужно повторять колесо, вот несколько примеров.Вы не обязательно знаете, но это работаетфункция;
01 Поставщик прямого подключения
В среде разработки и тестирования может потребоваться обойти реестр и протестировать только указанного поставщика услуг.В этом случае может потребоваться прямое соединение «точка-точка».Режим прямого соединения «точка-точка» займет служебный интерфейс как устройство и игнорирует список провайдеров центра регистрации.Конфигурация интерфейса A является двухточечной, что не влияет на интерфейс B для получения списка из центра регистрации (Примечание: официальный только рекомендует разработку и среда тестирования для использования этой функции), использование выглядит следующим образом, адрес, указанный в URL-адресе, является адресом прямого подключения:
<dubbo:reference id="demoService" interface="com.alibaba.dubbo.demo.DemoService" version="1.0.0" url="dubbo://172.18.1.205:20888/" />
02 Несколько версий
Когда реализован интерфейс и происходит несовместимое обновление, для перехода можно использовать номер версии, а службы с разными номерами версий не ссылаются друг на друга.
<dubbo:service interface="com.alibaba.dubbo.demo.DemoService" ref="demoService" version="1.0.0" />
Используя эту функцию dubbo, мы можем реализовать выпуск некоторых функций в оттенках серого.Этапы реализации следующие:
- Старая реализация интерфейса определяет версию = "1.0.0", а новая реализация интерфейса версия = "2.0.0"
- Сторона потребителя определяет версию = "*"
После того, как Provider и Consumer определены таким образом, новая и старая реализации интерфейса отвечают за каждую из них.50%
трафик;
Используя эту функцию dubbo, также можно выполнить миграцию несовместимой версии:
- В период низкого давления сначала обновите половину провайдеров до новой версии;
- Затем обновите всех потребителей до новой версии;
- Затем обновите оставшуюся половину провайдеров до новой версии.
03 Эхо-тест
Эхо-тест используется для определения доступности услуги.Эхо-тест выполняется в соответствии с обычным процессом запроса.Он может проверить, проходит ли весь вызов гладко, и может использоваться для мониторинга.
Все услуги реализованы автоматическиEchoServiceинтерфейс, просто приведите любую ссылку на службу кEchoServiceЕго можно использовать и использовать (demoService - это bean-компонент, управляемый пружиной)
EchoService echoService = (EchoService) demoService;
System.out.println(echoService.$echo("hello"));
04 Неявные параметры
в состоянии пройтиRpcContextизsetAttachment()
а такжеgetAttachment()
Неявная передача параметров между Потребителем и Поставщиком. Например, уровень контроллера перехватывает токен входа в систему и передает членский идентификатор, полученный из токена, в службу dubbo для использования метода неявной передачи параметров.setAttachment()
Установленная пара KV будет очищена после завершения одного удаленного вызова, то есть несколько удаленных вызовов должны быть установлены несколько раз. Как использовать:
- набор серверов
RpcContext.getContext().setAttachment("CRT_MEMBER_ID", "13828886888");
- клиент получает
RpcContext.getContext().getAttachment("CRT_MEMBER_ID")
05 Контекст
Контекст хранит информацию об окружающей среде, необходимую для текущего вызывающего процесса. Вся информация о конфигурации будет преобразована в параметры URL.
RpcContext — это регистратор временного состояния ThreadLocal.При получении или инициировании запроса RPC состояние RpcContext
изменится. Например: A настраивает B, B снова настраивает C, затем на машине B, прежде чем B настраивает C, RpcContext записывает информацию A настраивает B, и когда B настраивает C
После этого RpcContext записывает информацию о том, что B вызывает C. Как использовать:
boolean isConsumerSide = RpcContext.getContext().isConsumerSide();
06 Местный камуфляж
Локальная маскировка обычно используется для даунгрейда сервиса, например, для сервиса аутентификации, когда все сервис-провайдеры кладут трубку, клиент не кидает исключение, а передает Mock-данные.
Возвращает ошибку авторизации. Использование выглядит следующим образом: класс реализации, указанный mock, выполняется, когда провайдер выдает исключение RpcException (Должен генерировать исключение RpcException для выполнения), вместо того, чтобы возвращать результат удаленно:
<dubbo:reference id="demoService" interface="com.alibaba.dubbo.demo.DemoService" version="1.0.0" mock="com.alibaba.dubbo.demo.consumer.mock.DemoServiceMock"/>
Исходный код реализации DemoServiceMock:
public class DemoServiceMock implements DemoService {
public String sayHello(String name) {
return "mock-value";
}
}
07 Обобщенный вызов
Обобщенный метод вызова интерфейса в основном используется, когда у клиента нет интерфейсов API и классификаторов моделей.Все POJO в параметрах и возвращаемых значениях представлены Картами, которые обычно используются для интеграции фреймворка.Например, для реализации общего среда тестирования службы, которая может вызывать все реализации службы через GenericService. Как использовать:
<dubbo:reference id="demoService" interface="com.alibaba.dubbo.demo.DemoService" generic="true"/>
Исходный код вызова:
/**
* @author afei
* @version 1.0.0
* @since 2017年11月22日
*/
public class Main {
public static void main(String[] args) {
// 引⽤远程服务, 该实例⾥⾯封装了所有与注册中⼼及服务提供⽅连接,请缓存
ReferenceConfig<GenericService> reference = new ReferenceConfig<GenericService>();
// 弱类型接⼝名
reference.setInterface("com.alibaba.dubbo.demo.DemoService");
reference.setVersion("1.0.0");
// 声明为泛化接⼝
reference.setGeneric(true);
// ⽤com.alibaba.dubbo.rpc.service.GenericService可以替代所有接口引用⽤
GenericService genericService = reference.get();
// 基本类型以及Date,List,Map等不需要转换,直接调⽤
Object result = genericService.$invoke("sayYes", new String[] {
"java.lang.String"
},
new Object[] {"afei"});
System.out.println("result --> "+result);
// ⽤Map表示POJO参数,如果返回值为POJO也将自动转成Map
Map<String, Object> teacher = new HashMap<String, Object>();
teacher.put("id", "1");
teacher.put("name", "admin");
teacher.put("age", "18");
teacher.put("level", "3");
teacher.put("remark", "测试");
// 如果返回POJO将自动转成Map
result = genericService.$invoke("justTest", new String[]
{"com.alibaba.dubbo.demo.bean.HighTeacher"}, new Object[]{teacher}); System.out.println("result --> "+result);
}
}
08 Журнал доступа
Если вы хотите записывать информацию о каждом запросе, вы можете включить журнал доступа, аналогичный журналу доступа Ngnix. Примечание. Объем этого журнала относительно велик, обратите внимание на емкость диска. Как использовать (если вы настроите локальный, глобальный журнал доступа будет недействительным):
Настроить глобально:
<dubbo:provider accesslog="/app/dubbo-demo.log"/>
Локальная конфигурация:
<dubbo:service interface="com.alibaba.dubbo.demo.DemoService" ref="demoService" accesslog="/app/demo.log"/> <dubbo:service interface="com.alibaba.dubbo.demo.TestService" ref="testService" accesslog="/app/test.log"/>
Стиль формата журнала:
[2017-11-22 10:23:20] 172.18.1.205:56144 -> 172.18.1.205:20886 - com.alibaba.dubbo.demo.DemoService:1.0.0 sayHello(java.lang.String) ["afei"]
09 Отложенное воздействие
Если службе требуется время на прогрев, например инициализация локального кеша, ожидание размещения связанных ресурсов и т. д., вы можете использовать задержку, чтобы задержать экспозицию. Задержка в миллисекундах для Dubbo для предоставления службы после инициализации контейнера Spring. Как использовать:
<dubbo:provider delay="5000"/>
или:
<dubbo:service delay="5000" interface="com.alibaba.dubbo.demo.DemoService" ref="demoService" version="1.0.0"/>