Самое полное объяснение SpringCloudAlibaba во всей сети 2️⃣ (рекомендуемая подборка)

Spring Cloud распределенный
Самое полное объяснение SpringCloudAlibaba во всей сети 2️⃣ (рекомендуемая подборка)

Это 25-й день моего участия в августовском испытании обновлений. Узнайте подробности события:Испытание августовского обновления

🌈 Обзор прошлых выпусков

    Спасибо за чтение, я надеюсь, что это может быть полезно для вас.Если есть какие-либо недостатки в сообщении в блоге, пожалуйста, оставьте сообщение в области комментариев или добавьте меня в личное представление на главной странице, чтобы пообщаться со мной в частном порядке.Спасибо. за ваш щедрый совет. Я Сяолинь, мальчик, который умеет писать жуки и петь рэп.

2. Весеннее облако

2.1 Что такое SpringCloud

SpringCloud — это набор инструментов разработки с несколькими подпроектами, который интегрирует многие платформы с открытым исходным кодом.Он использует удобство разработки Spring Boot для реализации многих функций, таких как регистрация службы, обнаружение регистрации службы, балансировка нагрузки и т. д. процесс интеграции. В основном для инкапсуляции компонентов с открытым исходным кодом Netflix (Netflix). Появление SpringCloud действительно упрощает разработку распределенной архитектуры.

NetFlix — веб-сайт онлайн-видео в США и лидер индустрии микросервисов.Он признан выдающимся практиком крупномасштабных микросервисов производственного уровня.Компоненты NetFlix с открытым исходным кодом проверены в производстве в течение многих лет в его масштабная распределенная микросервисная среда. , поэтому многие компоненты в Spring Cloud основаны на инкапсуляции компонентов NetFlix.

2.2, основные компоненты

  1. eurekaserver, consul, nacos: Компоненты реестра службы.
  2. Rabbit & openfeign: Компоненты балансировки нагрузки и вызова службы.
  3. Панель инструментов hystrix и hystrix: обслуживание автоматического выключателя и компонентов мониторинга обслуживания.
  4. zuul, gateway: Компоненты сервисного шлюза.
  5. config: компонент единого центра конфигурации.
  6. bus: Компонент шины сообщений.

image-20200724161314786

2.3, название версии

SpringCloud — это крупномасштабный всеобъемлющий проект, состоящий из множества независимых подпроектов, каждый из которых имеет разный ритм выпуска и поддерживает свой номер версии выпуска. Чтобы лучше управлять версией Springcloud, используется список ресурсов BOM (Bill of Materials), чтобы избежать путаницы с номером выпуска подпроекта, поэтому используется не номер версии, а метод именования. Имена расположены в алфавитном порядке. Например, названия станций лондонского метро («Ангел» — первая версия, «Бристон» — вторая версия, «Кэмден» — третья версия). Когда точечные релизы для одного проекта накапливаются до критической массы или когда в одном из проектов возникает критическая ошибка, которая должна быть доступна для всех, в последовательности релизов будут выталкиваться «сервисные релизы» с именами, заканчивающимися на «.SRX». ", где "Х" - число.

Названия станций лондонского метро примерно такие: Angel, Brixton, Camden, Dalston, Edgware, Finchley, Greenwich, Hoxton.

2.4, выбор версии

Так как версия SpringCloud должна соответствовать версии SpringBoot, то и версию SpringBoot нужно выбирать в соответствии с версией SpringCloud.

image-20200709112427684

3. Весеннее облако Алибаба

3.1 Введение

Spring Cloud Alibaba является подпроектом Spring Cloud Spring Cloud Alibaba предоставляет универсальное решение для разработки распределенных приложений.Он включает в себя все компоненты, необходимые для разработки распределенных приложений, что позволяет легко использовать Spring Cloud Для разработки приложений с помощью Spring Cloud Alibaba, вам нужно только добавить некоторые аннотации и небольшую настройку для подключения приложений Spring Cloud к распределенным решениям Alibaba и использовать промежуточное ПО Alibaba для создания распределенных систем приложений. Spring Cloud Alibaba — это интеграция промежуточного программного обеспечения с открытым исходным кодом Alibaba и системы Spring Cloud.

image-20210504210759006

3.2 Основные функции

  1. Управление трафиком и деградация услуг: по умолчанию он поддерживает доступ к текущим функциям ограничения и деградации WebServlet, WebFlux, OpenFeign, RestTemplate, Spring Cloud, Gateway, Zuul, Dubbo и RocketMQ. Текущие правила ограничения и деградации могут быть изменены в режиме реального времени. через консоль во время выполнения. Он также поддерживает мониторинг показателей деградации при регулировании.
  2. Регистрация и обнаружение службы: экземпляры могут быть зарегистрированы на Alibaba Nacos, клиенты могут обнаруживать экземпляры с помощью компонентов, управляемых Spring, а балансировщики нагрузки Ribbon на стороне клиента поддерживаются через Spring Cloud Netflix.
  3. Распределенное управление конфигурацией: поддерживает внешнюю конфигурацию в распределенных системах и автоматически обновляет ее при изменении конфигурации.
  4. Возможности, управляемые сообщениями: создавайте возможности, управляемые сообщениями, для микросервисных приложений на основе Spring Cloud Stream.
  5. Шина сообщений: используйте Spring Cloud Bus RocketMQ для связи узлов распределенных систем.
  6. Распределенная транзакция: используйте аннотацию @GlobalTransactional для эффективного решения проблем с распределенными транзакциями без вмешательства в бизнес.
  7. Dubbo RPC: расширяет протокол обмена данными между службами Spring Cloud через Apache Dubbo RPC.
  8. Распределенное планирование задач: предоставляет точные, высоконадежные и высокодоступные службы планирования задач второго уровня (на основе выражений Cron). Он также предоставляет модели выполнения распределенных задач, такие как задачи сетки. Grid-задачи поддерживают равномерное распределение морских квантовых задач для всех рабочих (schedulerx-client) для выполнения.

3.3 Компоненты

  1. Sentinel: Принимая трафик в качестве точки входа, он защищает стабильность сервисов по нескольким параметрам, таким как управление трафиком, переход на более раннюю версию автоматического выключателя и защита от нагрузки на систему.
  2. Nacos: платформа динамического обнаружения сервисов, управления конфигурацией и управления сервисами, упрощающая создание облачных приложений.
  3. RocketMQ: Распределенная система обмена сообщениями с открытым исходным кодом, основанная на технологии распределенного кластера высокой доступности, обеспечивает малую задержку и высокую надежность. услуги публикации сообщений и подписки.
  4. Dubbo: Apache Dubbo™ — это высокопроизводительная платформа Java RPC.
  5. Seata: продукт Alibaba с открытым исходным кодом, простое в использовании высокопроизводительное решение для распределенных транзакций с микросервисами.
  6. Alibaba Cloud ACM: центр конфигурации приложений, который централизованно управляет конфигурациями приложений и распространяет их в среде с распределенной архитектурой. товар.
  7. Alibaba Cloud OSS: служба облачного хранилища объектов Alibaba (сокращенно OSS), предоставляемая Alibaba Cloud. Предоставляет массивные, безопасные, недорогие и высоконадежные услуги облачного хранения. Вы можете хранить и Доступ к любым типам данных.
  8. Alibaba Cloud SchedulerX: продукт распределенного планирования задач, разработанный командой промежуточного программного обеспечения Alibaba, обеспечивающий второй уровень, точный Точная, надежная и высокодоступная служба планирования задач (на основе выражений Cron).
  9. Alibaba Cloud SMS: служба SMS, охватывающая весь мир, дружественные, эффективные и интеллектуальные взаимосвязанные коммуникационные возможности, помогающие предприятиям быстро Создавайте каналы связи с клиентами.

image-20210504211009062

В-четвертых, построение микросервисных проектов

4.1. Технический отбор

  • Уровень сохраняемости: SpingData Jpa
  • База данных: MySQL5.7
  • Стек технологий: стек технологий SpringCloud Alibaba

4.2, конструкция модуля

Мы строим микросервисный проект, но только простой код без какой-либо бизнес-логики.

  • магазин родительский родительский проект
  • shop-product-api: API товарного микросервиса, используемый для хранения товарных сущностей.
  • shop-product-server: товарный микросервис, у него 1 порт 808x.
  • shop-order-api API микросервиса заказов, используемый для хранения объектов заказа.
  • микросервис заказов shop-order-server, его порт 808x.

4.3, вызов микросервиса

;В микросервисной архитектуре наиболее распространенным сценарием является взаимный вызов между микросервисами. Мы используем общие в системе электронной коммерцииПользователь размещает заказВ качестве примера для демонстрации вызова микрослужб: клиент инициирует запрос заказа в микрослужбу заказов, и перед сохранением заказа ему необходимо вызвать микрослужбу товаров, чтобы запросить информацию о товарах.

Обычно мы называем активного вызывающего абонента службыпотребители услуг, вызвать вызываемую службу какпоставщики услуг.

image-20201028144911439

4.4, создайте родительский проект

Создайте проект maven и добавьте следующее содержимое в файл pom.xml.

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.3.3.RELEASE</version>
    <relativePath/>
  </parent>
  <groupId>cn.linstudy</groupId>
  <artifactId>Shop-parent</artifactId>
  <packaging>pom</packaging>
  <version>1.0.0</version>
  <modules>
    <module>Shop-order-api</module>
    <module>Shop-order-server</module>
    <module>Shop-product-api</module>
    <module>Shop-product-server</module>
  </modules>
  <properties>
    <java.version>11</java.version>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    <spring-cloud.version>Hoxton.SR8</spring-cloud.version>
    <spring-cloud-alibaba.version>2.2.3.RELEASE</spring-cloud-alibaba.version>
  </properties>
  <dependencyManagement>
    <dependencies>
      <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-dependencies</artifactId>
        <version>${spring-cloud.version}</version>
        <type>pom</type>
        <scope>import</scope>
      </dependency>
      <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-alibaba-dependencies</artifactId>
        <version>${spring-cloud-alibaba.version}</version>
        <type>pom</type>
        <scope>import</scope>
      </dependency>
      <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>5.1.47</version>
      </dependency>
    </dependencies>
  </dependencyManagement>
</project>

4.5. Создание товарных услуг

4.5.1 Напишите зависимости Shop-product-api

Создайте проект Shop-product-api и добавьте в файл pom.xml следующее:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <parent>
    <artifactId>Shop-parent</artifactId>
    <groupId>cn.linstudy</groupId>
    <version>1.0.0</version>
  </parent>
  <modelVersion>4.0.0</modelVersion>
  <artifactId>Shop-product-api</artifactId>

  <properties>
    <maven.compiler.source>11</maven.compiler.source>
    <maven.compiler.target>11</maven.compiler.target>
  </properties>

  <dependencies>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>
    <dependency>
      <groupId>org.projectlombok</groupId>
      <artifactId>lombok</artifactId>
    </dependency>
  </dependencies>
</project>

4.5.2 Создание объекта

//商品
@Entity(name = "t_shop_product")
@Data
public class Product {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long pid;//主键
    private String pname;//商品名称
    private Double pprice;//商品价格
    private Integer stock;//库存
}

4.5.3 Напишите зависимости Shop-product-server

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <parent>
    <artifactId>Shop-parent</artifactId>
    <groupId>cn.linstudy</groupId>
    <version>1.0.0</version>
  </parent>
  <modelVersion>4.0.0</modelVersion>

  <artifactId>Shop-order-server</artifactId>

  <properties>
    <maven.compiler.source>11</maven.compiler.source>
    <maven.compiler.target>11</maven.compiler.target>
  </properties>

  <dependencies>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
    </dependency>
    <dependency>
      <groupId>com.alibaba</groupId>
      <artifactId>fastjson</artifactId>
      <version>1.2.56</version>
    </dependency>
    <dependency>
      <groupId>cn.linstudy</groupId>
      <artifactId>Shop-order-api</artifactId>
      <version>1.0.0</version>
    </dependency>
    <dependency>
      <groupId>cn.linstudy</groupId>
      <artifactId>Shop-product-api</artifactId>
      <version>1.0.0</version>
    </dependency>
      
   </dependencies>
</project>

4.5.4, напишите application.yml

server:
  port: 8081
spring:
  application:
    name: product-service
  datasource:
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql:///shop-product?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=true
    username: root
    password: admin
  jpa:
    properties:
      hibernate:
        hbm2ddl:
          auto: update
        dialect: org.hibernate.dialect.MySQL5InnoDBDialect

4.5.5, создать базу данных

Поскольку мы используем JPA, нам нужно создать базу данных, но не нужно создавать таблицу, потому что JPA автоматически создаст таблицу в соответствующей базе данных.

4.5.6 Создание интерфейса DAO

// 第一个参数是实体类,第二个参数是实体类对象的主键的类型
public interface ProductDao extends JpaRepository<Product,Long> {

}

4.5.7 Создайте интерфейс службы и класс его реализации

public interface ProductService {
  Product findById(Long productId);
}
@Service
public class ProductServiceImpl implements ProductService {
  @Autowired
  ProductDao productDao;
    
  @Override
  public Product findById(Long productId) {
    return productDao.findById(productId).get();
  }
}

4.5.8 Запись контроллера

@RestController
@Slf4j
public class ProductController {
    @Autowired
    private ProductService productService;
    
    //商品信息查询
    @RequestMapping("/product")
    public Product findByPid(@RequestParam("pid") Long pid) {
             Product product = productService.findByPid(pid);
             return product;
    }
}

4.5.9 Добавить тестовые данные

Когда мы запускаем проект, мы можем обнаружить, что таблица была автоматически создана для нас по умолчанию, и нам нужно импортировать тестовые данные.

INSERT INTO t_shop_product VALUE(NULL,'小米','1000','5000'); 
INSERT INTO t_shop_product VALUE(NULL,'华为','2000','5000'); 
INSERT INTO t_shop_product VALUE(NULL,'苹果','3000','5000'); 
INSERT INTO t_shop_product VALUE(NULL,'OPPO','4000','5000');

4.5.10 Испытание

image-20210505140802977

4.6. Создание микросервиса заказов

4.6.1 Напишите зависимости Shop-order-api

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <parent>
    <artifactId>Shop-parent</artifactId>
    <groupId>cn.linstudy</groupId>
    <version>1.0.0</version>
  </parent>
  <modelVersion>4.0.0</modelVersion>

  <artifactId>Shop-order-api</artifactId>

  <properties>
    <maven.compiler.source>11</maven.compiler.source>
    <maven.compiler.target>11</maven.compiler.target>
  </properties>

  <dependencies>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>
    <dependency>
      <groupId>org.projectlombok</groupId>
      <artifactId>lombok</artifactId>
    </dependency>
    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-annotations</artifactId>
    </dependency>
  </dependencies>
</project>

4.6.2. Создание сущности заказа

//订单
@Entity(name = "t_shop_order")
@Data
@JsonIgnoreProperties(value = { "hibernateLazyInitializer"})
public class Order implements Serializable {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long oid;//订单id

    //用户
    private Long uid;//用户id
    private String username;//用户名
    //商品
    private Long pid;//商品id
    private String pname;//商品名称
    private Double pprice;//商品单价
    //数量
    private Integer number;//购买数量
}

4.6.3. Создайте проект "магазин-заказ-сервер"

Добавьте зависимости в pom.xml.

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <parent>
    <artifactId>Shop-parent</artifactId>
    <groupId>cn.linstudy</groupId>
    <version>1.0.0</version>
  </parent>
  <modelVersion>4.0.0</modelVersion>

  <artifactId>Shop-order-server</artifactId>

  <properties>
    <maven.compiler.source>11</maven.compiler.source>
    <maven.compiler.target>11</maven.compiler.target>
  </properties>

  <dependencies>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
    </dependency>
    <dependency>
      <groupId>com.alibaba</groupId>
      <artifactId>fastjson</artifactId>
      <version>1.2.56</version>
    </dependency>
    <dependency>
      <groupId>cn.linstudy</groupId>
      <artifactId>Shop-order-api</artifactId>
      <version>1.0.0</version>
    </dependency>
    <dependency>
      <groupId>cn.linstudy</groupId>
      <artifactId>Shop-product-api</artifactId>
      <version>1.0.0</version>
    </dependency>
</project>

4.6.4, напишите application.yml

server:
  port: 8082
spring:
  application:
    name: order-service
  datasource:
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql:///shop-product?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=true
    username: root
    password: 1101121833
  jpa:
    properties:
      hibernate:
        hbm2ddl:
          auto: update
        dialect: org.hibernate.dialect.MySQL5InnoDBDialect

4.6.5 Служба записи и класс ее реализации

Написанный нами интерфейс Service и его классы реализации не имеют никакой бизнес-логики и используются только для тестирования.

public interface OrderService {
  Order getById(Long oid,Long pid);
}

@Service
public class OrderServiceImpl implements OrderService {

  @Autowired
  OrderDao orderDao;

  @Override
  public Order getById(Long oid, Long pid) {
    return orderDao.getOne(oid);
  }
}

4.6.6 Создание контроллера

@RestController
@Slf4j
public class OrderController {
    @Autowired
    private OrderService orderService;
  	@RequestMapping("getById")
  	public Order getById(Long oid,Long pid){
        return orderService.getById(oid, pid);
}

4.7 Как звонить между службами

Предположим, нам нужно вызвать сервис продукта в сервисе заказа, сначала запросить продукт, идентификатор которого равен 1, а затем запросить его заказ.На этот раз 1 включает вызов между сервисами. Вызов 1 между службами, по сути, инициирует запрос Http через код Java, и мы можем использовать RestTemplate для выполнения вызова.

4.7.1 Добавьте аннотации к классу запуска shop-order-server

Поскольку нам нужен класс RestTemplate, нам нужно внедрить класс RestTemplate в контейнер.

@SpringBootApplication
public class OrderServer {
    public static void main(String[] args) {
        SpringApplication.run(OrderServer.class,args);
    }
    @Bean
    public RestTemplate restTemplate(){
        return new RestTemplate();
    }
}

4.7.2. Изменить код контроллера

@RestController
public class OrderController {

  @Autowired
  RestTemplate restTemplate;

  @Autowired
  OrderService orderService;
  @RequestMapping("getById")
  public Order getById(Long oid,Long pid){
    Product product = restTemplate.getForObject(
        "http://localhost:8083/product?productId="+pid,Product.class); // 这里通过restTemplate去发起http请求,请求地址是http://localhost:8083/product,携带的参数是productId
    Order order = orderService.getById(oid, product.getPid());
    order.setUsername(product.getPname());
    return order;
  }
}

Таким образом, мы завершили взаимный вызов между службами.

4.8. Существующие проблемы

Хотя мы уже можем реализовать вызовы между микросервисами. Но мы жёстко прописали в код сетевой адрес (ip, порт) поставщика услуг, с таким подходом много проблем:

  • После изменения адреса поставщика услуг код необходимо изменить вручную.

  • При наличии нескольких поставщиков услуг функция балансировки нагрузки не может быть достигнута.

  • Как только сервисов становится все больше и больше, трудно вручную поддерживать взаимосвязь вызовов.

Итак, как мы должны решить это? В это время нам нужно пройтиРегистрационный центрдинамическая реализацияСлужба управления.