Прежде всего, нам нужно понять, какова его функция, чтобы обеспечить взаимный вызов интерфейсов между разными микросервисами.
сервисный звонок
1. Запустите регистрационный центр Nacos.
1. Загрузка и установка Nacos
Адрес загрузки: https://github.com/alibaba/nacos/releases 2. Ссылка на
Nacos при запуске Windows : https://github.com/alibaba/nacos Распаковка: распакуйте загруженный сжатый пакет и запустите: start.cmd -m автономный 3. Посетите http://localhost:8848/nacos.
Имя пользователя и пароль: nacos/nacos
2. Обнаружение услуг
Сначала мы создаем проект SpringBoot.
1. Вводим зависимости и
настраиваем зависимости клиента Nacos в модуле service-base.
<!--服务发现-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
2. Добавьте информацию о конфигурации сервиса.
Поместите микросервисы, которые необходимо зарегистрировать в центре регистрации, в файл конфигурации и добавьте конфигурацию (человечно говоря, добавьте ее в файл конфигурации каждого микросервиса, чтобы зарегистрировать его в сервисе nacos) #spring
:
Cloud :
nacos:
Discovery:
server-addr: localhost:8848 # адрес службы nacos
3. Запустите микросервисы
Запустите зарегистрированные микросервисы, отметьте «управление сервисами => список сервисов», вы увидите зарегистрированные микросервисы
3. Внедрение OpenFeign на потребительскую сторону
Настройте зависимости OpenFeign в модуле service-base (на самом деле зависимости OpenFeign необходимы на стороне потребителя сервиса)
<!--服务调用-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
2. Добавьте аннотации к классу запуска.
Добавьте следующие аннотации к классу запуска service-sms, указывающие, что мне можно позвонить удаленно.
@EnableFeignClients
В-четвертых, удаленный вызов интерфейса
Добавить удаленный вызов в service-sms
// @FeignClient(value = "service-core") указывает, какую службу я вызываю, значением является имя службы
1, CoreUserInfoClient
@FeignClient(value = "service-core")
public interface CoreUserInfoClient {
@GetMapping("/api/core/userInfo/checkMobile/{mobile}")
boolean checkMobile(@PathVariable String mobile);
}
Пять, контроль тайм-аута
Тайм-аут соединения openfeign по умолчанию составляет 1 секунду, и во время теста может возникнуть ошибка тайм-аута удаленного вызова.
В файл конфигурации можно добавить следующую конфигурацию:
feign:
client:
config:
default:
connectTimeout: 10000 #Конфигурация таймаута соединения
readTimeout: 600000 #Выполнить конфигурацию таймаута
6. Может быть служба удаленных звонков, которая сгорела (сервер внезапно зависает, а я все равно хочу позвонить по этому интерфейсу)
Мы принимаем процесс слияния и понижения версии. Если есть служба удаленных вызовов, она сливается. Мы создаем класс реализации в этой службе, который не обрабатывает интерфейс, и возвращает данные пользователю для запроса. Гарантировано, в случае что доступ к удаленному интерфейсу недоступен. Я также могу получить доступ к локальному интерфейсу в разделе
Первый шаг — ввести зависимости в сервисах, требующих удаленных вызовов.
<!--服务容错-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
2. Включите поддержку Sentinel.
Включите поддержку Feign для Sentinel в файле конфигурации yml service-sms.
#开启Feign对Sentinel的支持
#feign:
sentinel:
enabled: true
3. Создать отказоустойчивый класс // Если интерфейс удаленного вызова выйдет из строя, я вызову локальный интерфейс и передам пользовательские данные
@Service
@Slf4j
public class CoreUserInfoClientFallback implements CoreUserInfoClient {
@Override
public boolean checkMobile(String mobile) {
log.error("远程调用失败,服务熔断");
return false;
}
}
4. Укажите класс Fuse.
Добавьте значение резервного атрибута для интерфейса удаленного вызова OpenFeign без указания класса отказоустойчивости.
@FeignClient(value = "service-core", fallback = CoreUserInfoClientFallback.class)
public interface CoreUserInfoClient {
сервисный шлюз
Прежде всего, давайте поговорим о его функции: я могу получить доступ к URL-адресу одного и того же порта и получить доступ к интерфейсу разных серверов.
1. Создайте модуль сервис-шлюза.
Создайте общий модуль maven.
Артефакт: сервис-шлюз.
2. Настройте pom.
Добавьте следующие зависимости в pom api-gateway.
<dependencies>
<!-- 网关 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<!--服务注册-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
</dependencies>
3. Настройте файл application.yml.
server:
port: 80 # 服务端口
spring:
profiles:
active: dev # 环境设置
application:
name: service-gateway # 服务名
cloud:
nacos:
discovery:
server-addr: localhost:8848 # nacos服务地址
gateway:
discovery:
locator:
enabled: true # gateway可以发现nacos中的微服务,并自动生成转发路由
4. Создайте стартап-класс
@EnableDiscoveryClient указывает, что это микрослужба шлюза.
@SpringBootApplication
@EnableDiscoveryClient
public class ServiceGatewayApplication {
public static void main(String[] args) {
SpringApplication.run(ServiceGatewayApplication.class, args);
}
}
5. Проверьте автоматическую маршрутизацию и переадресацию.
Правило Http://localhost/service-core/admin/core/integralGrade/list :
http://Gateway_HOST:Gateway_PORT/serviceId/**
. Когда мы не хотим снова вызывать, мы используем описанный выше метод по умолчанию для доступа к шлюз. Мы можем сделать это ниже. Настройте маршрутизацию самостоятельно.
2. Конфигурация маршрутизации
1.
Добавьте конфигурацию маршрутизации в файл базовой конфигурации application.yml.
#spring:
# cloud:
# gateway:
routes:
- id: service-core
uri: lb://service-core
predicates:
- Path=/*/core/**
- id: service-sms
uri: lb://service-sms
predicates:
- Path=/*/sms/**
- id: service-oss
uri: lb://service-oss
predicates:
- Path=/*/oss/**
2. Тестовая переадресация маршрута
http://localhost/admin/core/integralGrade/list.
В конфигурации шлюза возникнет междоменная проблема, а @CrossOrigin находится в конфликте, поэтому он не может решить междоменную проблему.
Давайте решим эту проблему.
3. Междоменная конфигурация
Добавьте междоменную конфигурацию в API-шлюз.
@Configuration
public class CorsConfig {
@Bean
public CorsWebFilter corsFilter() {
CorsConfiguration config = new CorsConfiguration();
config.setAllowCredentials(true); //是否允许携带cookie
config.addAllowedOrigin("*"); //可接受的域,是一个具体域名或者*(代表任意域名)
config.addAllowedHeader("*"); //允许携带的头
config.addAllowedMethod("*"); //允许访问的方式
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
source.registerCorsConfiguration("/**", config);
return new CorsWebFilter(source);
}
}
2. Удалите междоменную конфигурацию серверной части.
Удалите междоменную аннотацию @CrossOrigin в микросервисе.