карта разума
Статья была выбрана Github, добро пожаловать в Star:GitHub.com/Yehongqin/Лай…
предисловие
В настоящее время в стеке технологий SpringCloud OpenFeign является наиболее часто используемым сервисом для вызова сервисов, поэтому в этой статье рассказывается об OpenFeign в надежде помочь всем.
1. Строительный проект
Используйте Nacos в качестве центра регистрации, если вы не строите Nacos, вы можете обратиться к предыдущей статье о центре регистрации.
Сначала родительский проект вводится в зависимости.
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Finchley.SR1</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>0.2.2.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-openfeign</artifactId>
<version>2.0.1.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency><!-- SpringCloud nacos服务发现的依赖 -->
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.nacos</groupId>
<artifactId>nacos-client</artifactId>
<version>1.2.0</version>
</dependency>
</dependencies>
Создайте проект поставщика и проект потребителя.
Проект провайдера наследует pom-файл родительского проекта, а класс запуска записывается следующим образом:
@SpringBootApplication
@EnableDiscoveryClient//注册中心
public class ProviderApplication {
public static void main(String[] args) throws Exception {
SpringApplication.run(ProviderApplication.class, args);
}
}
Конфигурационный файл проекта провайдера выглядит следующим образом:
server:
port: 8080
spring:
application:
name: provider
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
service: ${spring.application.name}
Предоставьте интерфейс, контроллер выглядит следующим образом:
@RestController
public class ProviderController {
@RequestMapping("/provider/list")
public List<String> list() {
List<String> list = new ArrayList<>();
list.add("java技术爱好者");
list.add("SpringCloud");
list.add("没有人比我更懂了");
return list;
}
}
Проект-потребитель также наследует родительский файл pom, а также зависимости Feign:
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
<!-- 版本在parent的pom文件中指定了 -->
</dependency>
</dependencies>
Напишите класс запуска следующим образом:
@SpringBootApplication
@EnableDiscoveryClient
//开启feign接口扫描,指定扫描的包
@EnableFeignClients(basePackages = {"com.yehongzhi.springcloud"})
public class ConsumerApplication {
public static void main(String[] args) throws Exception {
SpringApplication.run(ConsumerApplication.class, args);
}
}
После настройки среды есть два способа ее использования.
2. Декларативный
Это очень просто: потребительский проект добавляет интерфейс ProviderClient.
@FeignClient(name = "provider")
//会扫描指定包下,标记FeignClient注解的接口
//会根据服务名,从注册中心找到对应的IP地址
public interface ProviderClient {
//这里跟提供者接口的URL一致
@RequestMapping("/provider/list")
String list();
}
Затем используйте интерфейс ConsumerController потребительского проекта для тестирования.
@RestController
public class ConsumerController {
//引入Feign客户端
@Resource
private ProviderClient providerClient;
@RequestMapping("/consumer/callProvider")
public String callProvider() {
//使用Feign客户端调用其他服务的接口
return providerClient.list();
}
}
Наконец, мы начинаем разработку провайдера, разработку потребителя, реестр, тестирование.
Затем вызовите интерфейс ConsumerController потребителя.
3. Наследование
Студенты наблюдатели могут обнаружить, что на самом деле будет написать еще одно декларативные определения, предоставляемые интерфейсом, есть дублирование кода, поскольку существует дубликата определения, то мы можем быть извлечены, поэтому будет церемония преемственности.
Первый шаг — создать общий проект API проекта Maven и определить интерфейс в файле API.
На втором этапе ProviderController проекта поставщика услуг реализует интерфейс Provider.
@RestController
public class ProviderController implements ProviderApi {
public String list() {
List<String> list = new ArrayList<>();
list.add("java技术爱好者");
list.add("SpringCloud");
list.add("没有人比我更懂了");
return list.toString();
}
}
На третьем шаге ProviderClient потребительского проекта определять не нужно, нужно только наследовать ProviderApi, а затем добавить @FeignClient.
@FeignClient(name = "provider")
public interface ProviderClient extends ProviderApi {
}
Больше ничего менять не нужно.Наконец, запустите поставщика услуг, потребителя и реестр, чтобы протестировать их.
Успех теста! Преимущество вышеописанного наследования в том, что нужно только один раз определить интерфейс в проекте API, поставщик услуг реализует конкретную логику, а потребитель наследует интерфейс и вставляет аннотацию, что очень удобно и быстро.
Недостатком является то, что если кто-то переместит интерфейс API, это заставит многих потребителей и поставщиков услуг сообщать об ошибках, а связь будет относительно сильной. Проект API эквивалентен общедоступному проекту, и как потребители, так и серверы будут полагаться на этот проект, поэтому обычно требуется, чтобы интерфейс API нельзя было случайно удалить.
Четыре, конфигурация, связанная с Feign
Давайте поговорим о некоторых общих связанных конфигурациях Feign.
4.1 Настройки времени ожидания запроса
Нижний слой Feign фактически использует ленту, и значение по умолчанию равно 1 секунде. Поэтому, если оно превышает 1 секунду, будет сообщено об ошибке.
Попробуйте дальше. Я добавляю код, который спит 1,5 секунды, в интерфейс поставщика услуг, а затем использую потребителя для его использования.
@RestController
public class ProviderController implements ProviderApi {
public String list() {
List<String> list = new ArrayList<>();
list.add("java技术爱好者");
list.add("SpringCloud");
list.add("没有人比我更懂了");
try {
//休眠1.5秒
Thread.sleep(1500);
} catch (Exception e) {
e.printStackTrace();
}
return list.toString();
}
}
После вызова потребителя вы можете увидеть ошибку в консоли, потому что она превышает 1 секунду.
Если вы хотите настроить время ожидания, вы можете добавить конфигурацию на стороне потребителя:
ribbon:
ReadTimeout: 5000 #请求时间5秒
ConnectTimeout: 5000 #连接时间5秒
Чтобы показать эффект, мы добавляем в код расходоменного расчета потребителя:
@RestController
public class ConsumerController {
@Resource
private ProviderClient providerClient;
@RequestMapping("/consumer/callProvider")
public String callProvider() throws Exception {
long star = System.currentTimeMillis();
String list = providerClient.list();
long end = System.currentTimeMillis();
return "响应结果:" + list + ",耗时:" + (end - star) / 1000 + "秒";
}
}
Наконец, запустите тест, и вы увидите, что запрос может быть успешным более 1 секунды.
4.2 Функция печати журнала
Во-первых, вам нужно настроить уровень журнала печати Feign.
@Configuration
public class FeignConfig {
/**
* NONE:默认的,不显示任何日志
* BASIC:仅记录请求方法、URL、响应状态码及执行时间
* HEADERS:出了BASIC中定义的信息之外,还有请求和响应的头信息
* FULL:除了HEADERS中定义的信息之外,还有请求和响应的正文及元素
*/
@Bean
public Logger.Level feginLoggerLevel() {
return Logger.Level.FULL;
}
}
Второй шаг — настроить интерфейс Feign для печати. Feign создает регистратор для каждого клиента. По умолчанию именем логгера является полное имя класса интерфейса Feigh. должны знать о том,Печать журнала Feign будет реагировать только на уровень DEBUG.
#与server同级
logging:
level:
com.yehongzhi.springcloud.consumer.feign.ProviderClient: debug
После завершения настройки консоль может увидеть подробную информацию о запросе.
4.3 Фейк реализует предохранитель
На самом деле, openFeign представил связанный пакет jar hystrix, поэтому его можно использовать напрямую, установить время ожидания и вызвать метод FallBack по истечении времени ожидания, чтобы реализовать механизм прерывателя цепи.
Сначала добавьте зависимости Maven в потребительский проект.
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
Второй шаг — включить механизм предохранителей в конфигурации и добавить период ожидания.
#默认是不支持的,所以这里要开启,设置为true
feign:
hystrix:
enabled: true
hystrix:
command:
default:
execution:
isolation:
thread:
timeoutInMilliseconds: 3000
Третий шаг — написать класс FallBack.
//ProviderClient是贴了@FeignClient注解的接口
@Component
public class ProviderClientFallBack implements ProviderClient {
@Override
public String list() {
return Arrays.asList("调用fallBack接口", "返回未知结果").toString();
}
}
Четвертый шаг — добавить резервный атрибут в соответствующий интерфейс Feign.
//fallback属性,填写刚刚编写的FallBack回调类
@Component
@FeignClient(name = "provider", fallback = ProviderClientFallBack.class)
public interface ProviderClient extends ProviderApi {
}
Наконец, вы можете протестировать его.Если он превысит установленные 3 секунды, он будет взорван, и будет вызван метод FallBack для возврата.
4.4 Настройка балансировки нагрузки
Как упоминалось ранее, нижний уровень OpenFeign использует Ribbon, а Ribbon — это компонент, отвечающий за балансировку нагрузки. Поэтому стратегию балансировки нагрузки можно задать в конфигурации.
По умолчанию используется стратегия опроса. Если вы хотите перейти на другие стратегии, такие как случайные, как это изменить.
Это очень просто, достаточно изменить конфигурацию:
#服务名称
provider:
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
#NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule #配置规则 随机
#NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RoundRobinRule #配置规则 轮询
#NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RetryRule #配置规则 重试
#NFLoadBalancerRuleClassName: com.netflix.loadbalancer.WeightedResponseTimeRule #配置规则 响应时间权重
#NFLoadBalancerRuleClassName: com.netflix.loadbalancer.BestAvailableRule #配置规则 最空闲连接策略
Суммировать
OpenFeign объединяет вместе RestTemplete, Ribbon и Hystrix, которые можно использовать более удобно и элегантно для предоставления и вызова всей службы. Избегайте дублирования и вставки URL-адресов интерфейса или повторного определения интерфейсов и т. д. Все еще стоит учиться.
Раньше микросервисы SpringCloud, созданные моей компанией, не использовали Feign. Архитектор написал прокси-класс АОП для вызова сервиса. Тайм-аут составлял 5 секунд и был прописан в коде. В то время существовал интерфейс микросервиса для загружать файлы, всегда Если истекает время ожидания, время ожидания не может быть изменено.По истечении времени ожидания метод предохранителя настраивается для возврата времени ожидания запроса на обслуживание, что очень болезненно.
Если бы в то время использовался Feign, подключаемый и настраиваемый способ, возможно, это не было бы так хлопотно.
Тогда притворяйтесь здесь, код всех приведенных выше примеров загружен на Github:
Ставьте лайки, если считаете это полезным, ваши лайки — самая большая мотивация для моего творчества.~
Не хочу быть соленой рыбой, я программист, стремящийся запомниться всем. Увидимся в следующий раз! ! !
Возможности ограничены, если есть какие-то ошибки или неуместности, пожалуйста, критикуйте и исправьте их, учитесь и общайтесь вместе!