Это 25-й день моего участия в августовском испытании обновлений. Узнайте подробности события:Испытание августовского обновления
🌈 Обзор прошлых выпусков
Спасибо за чтение, я надеюсь, что это может быть полезно для вас.Если есть какие-либо недостатки в сообщении в блоге, пожалуйста, оставьте сообщение в области комментариев или добавьте меня в личное представление на главной странице, чтобы пообщаться со мной в частном порядке.Спасибо. за ваш щедрый совет. Я Сяолинь, мальчик, который умеет писать жуки и петь рэп.
- Самое полное объяснение SpringCloudAlibaba во всей сети 1️⃣ (рекомендуемая подборка)
- 💖Познакомьтесь с RocketMQ за 10 минут! Если хочешь зайти на али, то даже этого сделать нельзя? 2️⃣💖
- 💖Познакомьтесь с RocketMQ за 10 минут! Если хочешь зайти на али, то даже этого сделать нельзя? 1️⃣💖
2. Весеннее облако
2.1 Что такое SpringCloud
SpringCloud — это набор инструментов разработки с несколькими подпроектами, который интегрирует многие платформы с открытым исходным кодом.Он использует удобство разработки Spring Boot для реализации многих функций, таких как регистрация службы, обнаружение регистрации службы, балансировка нагрузки и т. д. процесс интеграции. В основном для инкапсуляции компонентов с открытым исходным кодом Netflix (Netflix). Появление SpringCloud действительно упрощает разработку распределенной архитектуры.
NetFlix — веб-сайт онлайн-видео в США и лидер индустрии микросервисов.Он признан выдающимся практиком крупномасштабных микросервисов производственного уровня.Компоненты NetFlix с открытым исходным кодом проверены в производстве в течение многих лет в его масштабная распределенная микросервисная среда. , поэтому многие компоненты в Spring Cloud основаны на инкапсуляции компонентов NetFlix.
2.2, основные компоненты
- eurekaserver, consul, nacos: Компоненты реестра службы.
- Rabbit & openfeign: Компоненты балансировки нагрузки и вызова службы.
- Панель инструментов hystrix и hystrix: обслуживание автоматического выключателя и компонентов мониторинга обслуживания.
- zuul, gateway: Компоненты сервисного шлюза.
- config: компонент единого центра конфигурации.
- bus: Компонент шины сообщений.
2.3, название версии
SpringCloud — это крупномасштабный всеобъемлющий проект, состоящий из множества независимых подпроектов, каждый из которых имеет разный ритм выпуска и поддерживает свой номер версии выпуска. Чтобы лучше управлять версией Springcloud, используется список ресурсов BOM (Bill of Materials), чтобы избежать путаницы с номером выпуска подпроекта, поэтому используется не номер версии, а метод именования. Имена расположены в алфавитном порядке. Например, названия станций лондонского метро («Ангел» — первая версия, «Бристон» — вторая версия, «Кэмден» — третья версия). Когда точечные релизы для одного проекта накапливаются до критической массы или когда в одном из проектов возникает критическая ошибка, которая должна быть доступна для всех, в последовательности релизов будут выталкиваться «сервисные релизы» с именами, заканчивающимися на «.SRX». ", где "Х" - число.
Названия станций лондонского метро примерно такие: Angel, Brixton, Camden, Dalston, Edgware, Finchley, Greenwich, Hoxton.
2.4, выбор версии
Так как версия SpringCloud должна соответствовать версии SpringBoot, то и версию SpringBoot нужно выбирать в соответствии с версией SpringCloud.
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.
3.2 Основные функции
- Управление трафиком и деградация услуг: по умолчанию он поддерживает доступ к текущим функциям ограничения и деградации WebServlet, WebFlux, OpenFeign, RestTemplate, Spring Cloud, Gateway, Zuul, Dubbo и RocketMQ. Текущие правила ограничения и деградации могут быть изменены в режиме реального времени. через консоль во время выполнения. Он также поддерживает мониторинг показателей деградации при регулировании.
- Регистрация и обнаружение службы: экземпляры могут быть зарегистрированы на Alibaba Nacos, клиенты могут обнаруживать экземпляры с помощью компонентов, управляемых Spring, а балансировщики нагрузки Ribbon на стороне клиента поддерживаются через Spring Cloud Netflix.
- Распределенное управление конфигурацией: поддерживает внешнюю конфигурацию в распределенных системах и автоматически обновляет ее при изменении конфигурации.
- Возможности, управляемые сообщениями: создавайте возможности, управляемые сообщениями, для микросервисных приложений на основе Spring Cloud Stream.
- Шина сообщений: используйте Spring Cloud Bus RocketMQ для связи узлов распределенных систем.
- Распределенная транзакция: используйте аннотацию @GlobalTransactional для эффективного решения проблем с распределенными транзакциями без вмешательства в бизнес.
- Dubbo RPC: расширяет протокол обмена данными между службами Spring Cloud через Apache Dubbo RPC.
- Распределенное планирование задач: предоставляет точные, высоконадежные и высокодоступные службы планирования задач второго уровня (на основе выражений Cron). Он также предоставляет модели выполнения распределенных задач, такие как задачи сетки. Grid-задачи поддерживают равномерное распределение морских квантовых задач для всех рабочих (schedulerx-client) для выполнения.
3.3 Компоненты
- Sentinel: Принимая трафик в качестве точки входа, он защищает стабильность сервисов по нескольким параметрам, таким как управление трафиком, переход на более раннюю версию автоматического выключателя и защита от нагрузки на систему.
- Nacos: платформа динамического обнаружения сервисов, управления конфигурацией и управления сервисами, упрощающая создание облачных приложений.
- RocketMQ: Распределенная система обмена сообщениями с открытым исходным кодом, основанная на технологии распределенного кластера высокой доступности, обеспечивает малую задержку и высокую надежность. услуги публикации сообщений и подписки.
- Dubbo: Apache Dubbo™ — это высокопроизводительная платформа Java RPC.
- Seata: продукт Alibaba с открытым исходным кодом, простое в использовании высокопроизводительное решение для распределенных транзакций с микросервисами.
- Alibaba Cloud ACM: центр конфигурации приложений, который централизованно управляет конфигурациями приложений и распространяет их в среде с распределенной архитектурой. товар.
- Alibaba Cloud OSS: служба облачного хранилища объектов Alibaba (сокращенно OSS), предоставляемая Alibaba Cloud. Предоставляет массивные, безопасные, недорогие и высоконадежные услуги облачного хранения. Вы можете хранить и Доступ к любым типам данных.
- Alibaba Cloud SchedulerX: продукт распределенного планирования задач, разработанный командой промежуточного программного обеспечения Alibaba, обеспечивающий второй уровень, точный Точная, надежная и высокодоступная служба планирования задач (на основе выражений Cron).
- Alibaba Cloud SMS: служба SMS, охватывающая весь мир, дружественные, эффективные и интеллектуальные взаимосвязанные коммуникационные возможности, помогающие предприятиям быстро Создавайте каналы связи с клиентами.
В-четвертых, построение микросервисных проектов
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, вызов микросервиса
;В микросервисной архитектуре наиболее распространенным сценарием является взаимный вызов между микросервисами. Мы используем общие в системе электронной коммерцииПользователь размещает заказВ качестве примера для демонстрации вызова микрослужб: клиент инициирует запрос заказа в микрослужбу заказов, и перед сохранением заказа ему необходимо вызвать микрослужбу товаров, чтобы запросить информацию о товарах.
Обычно мы называем активного вызывающего абонента службыпотребители услуг, вызвать вызываемую службу какпоставщики услуг.
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 Испытание
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, порт) поставщика услуг, с таким подходом много проблем:
-
После изменения адреса поставщика услуг код необходимо изменить вручную.
-
При наличии нескольких поставщиков услуг функция балансировки нагрузки не может быть достигнута.
-
Как только сервисов становится все больше и больше, трудно вручную поддерживать взаимосвязь вызовов.
Итак, как мы должны решить это? В это время нам нужно пройтиРегистрационный центрдинамическая реализацияСлужба управления.