(2 октября 2018 г., мигрировал с git сюда) через кейс по разработке веб-микросервисных проектов на базе Spring cloud, галантереи много. Облачная система Spring предоставляет комплексное решение для разработки микросервисов и объединяет несколько отличных компонентов, которые могут помочь нам повысить эффективность разработки. Вот краткое изложение.
Оригинал того же автора:blog.CSDN.net/Zhang_Control...
Введение в Spring Cloud
Spring Cloud — это инструмент разработки микросервисной архитектуры на основе Spring Boot. Он обеспечивает простой способ разработки таких операций, как управление конфигурацией, управление службами, автоматические выключатели, интеллектуальная маршрутизация, микроагенты, шины управления, глобальные блокировки, выбор решений, распределенные сеансы и управление состоянием кластера, разработанные в архитектуре микросервисов.
Подпроект Spring Cloud
Spring Cloud Config
Инструмент управления конфигурацией поддерживает использование Git для хранения содержимого конфигурации, может использовать его для внешнего хранения конфигурации приложения, а также поддерживает обновление информации о конфигурации клиента, шифрование/дешифрование содержимого конфигурации и т. д.
Spring Cloud Netflix
Основной компонент объединяет несколько пакетов Netflix OSS с открытым исходным кодом.
Eureka
Компонент управления услугами, включая реализацию реестра услуг, механизм регистрации и обнаружения услуг.
Hystrix
Компонент управления отказоустойчивостью реализует шаблон прерывателя цепи, чтобы помочь обслуживать зависимости и обеспечить высокую отказоустойчивость при сбоях.
Ribbon
Компонент вызова службы балансировки нагрузки клиента.
Feign
Компонент декларативного вызова службы на основе Ribbon и Hystrix.
Zuul
Компонент шлюза, обеспечивающий интеллектуальную маршрутизацию, фильтрацию доступа и другие функции.
Archaius
Externalize компоненты конфигурации.
Spring Cloud Bus
События, шина обмена сообщениями, используются для распространения изменений состояния или событий в кластере для запуска последующей обработки, например, для динамического обновления конфигурации.
Spring Cloud Cluster
Реализация алгоритмов выборов и шаблонов общего состояния для ZooKeeper, Redis, Hazelcast, Consul.
Spring Cloud Consul
Обнаружение сервисов и инструменты управления конфигурацией.
Spring Cloud Stream
Потребительские микросервисы, реализованные с помощью Redis, Rabbit или Kafka, могут отправлять и получать сообщения с помощью простой декларативной модели.
Spring Cloud Security
Инструментарий безопасности, предоставляющий повторители для клиентских запросов OAuth2 в прокси-сервере Zuul.
Spring Cloud Sleuth
Реализация распределенной трассировки приложений Spring Cloud, которая может идеально интегрировать Zipkin.
Spring Cloud ZooKeeper
Компоненты обнаружения служб и управления конфигурацией на основе ZooKeeper.
Spring Cloud Starters
Основной компонент Spring Cloud, который является базовым модулем зависимостей, основанным на проектах в стиле Spring Boot.
Компонентная архитектура
Введение в реальный проект (Springcloud_Sell)
Этот реальный бой основан на Springboot + maven для быстрой настройки и использует Spring Cloud, универсальное решение в рамках распределенной микросервисной архитектуры, объединяющее компоненты.Eureka+Config+Zuul+Feign/Ribbon+Hystrix+RabbitMQ+Redis+Sleuth+ZipKin
Среда разработки:JDK1.8+MySQL5.7 + IDEA
Гит-адрес:git ee.com/homestead1234…
Модули проекта в основном включают:api-gateway
(шлюз),client
(клиент),config
(Центр конфигурации),erurka
(Центр регистрации и обнаружения услуг),order
(модуль заказа),product
(товарный модуль),user
(Пользовательский модуль)
структура пакета проекта
Создание реестра услуг (eureka)
Создайте базовый проект Springboot, назовите его eureka и введите соответствующие зависимости в pom.xml.
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
</dependencies>
<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>
</dependencies>
</dependencyManagement>
Запустите реестр службы с помощью аннотации @EnableEurekaServer, чтобы предоставить регистрацию другим приложениям, а также разверните и запустите проект Springboot одним щелчком мыши.
@SpringBootApplication
@EnableEurekaServer
public class EurekaApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaApplication.class, args);
}
}
Конфигурация application.yml выглядит следующим образом: В конфигурации по умолчанию реестр службы также попытается зарегистрироваться в качестве клиента, поэтому мы можем отключить его поведение при регистрации клиента, т. е.eureka.client.register-with-eureka: false
eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka/
register-with-eureka: false
server:
enable-self-preservation: false
spring:
application:
name: eureka
server:
port: 8761
После завершения вышеуказанной конфигурации запустите проект и получите доступhttp://localhost:8761/, панель реестра eureka отображается следующим образом
Регистрация поставщика услуг (клиента)
Завершите построение реестра, попробуйте зарегистрировать приложение Springboot в системе управления сервисом eureka, создайте приложение Springboot и добавьте следующие зависимости.
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<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>
</dependencies>
</dependencyManagement>
Файл конфигурации на стороне клиента выглядит следующим образом:
eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka/,http://localhost:8762/eureka/
#instance:
# hostname: clientName
spring:
application:
name: client
server:
port: 8081
Запустите клиент eureka через аннотацию @EnableEurekaClient, предоставьте услуги и выполните регистрацию службы.Сам @EnableEurekaClient реализован с помощью @EnableDiscoveryClient
/**启动类
*
* @author jiayuan9608@163.com
* 2018-10-02 15:05
* @version 1.0.0
*/
@SpringBootApplication
@EnableEurekaClient
public class ClientApplication {
public static void main(String[] args) {
SpringApplication.run(ClientApplication.class, args);
}
}
Обновите страницу центра регистрации eureka, в это время клиент зарегистрировал услугу на eureka
Единый центр конфигурации (config)
Создайте приложение springboot, pom.xml зависит от того же клиента, что и выше, и также использует себя как клиентскую службу, а также должен быть зарегистрирован в eureka;
Файл конфигурации application.yml выглядит следующим образом: настройте удаленный адрес Git и пароль учетной записи в файле, который используется для извлечения соответствующей конфигурации из удаленного файла. Обратите внимание, что конфигурация, извлеченная из центра конфигурации, будет объединена с существующей локальной конфигурацией, если она совпадает, она будет перезаписана.
spring:
application:
name: config
cloud:
config:
server:
git:
uri: https://gitee.com/jiayuan1234/config-repo
username: 2352840798@qq.com
password: **********
basedir: D:\MyData\workspace\IDEA\SpringCloud_Sell\config\basedir
eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka/
management:
endpoints:
web:
exposure:
include: "*"
server:
port: 8082
Файл конфигурации удаленного Git
Запустите проект конфигурации и получите содержимое файла конфигурации.
структура таблицы базы данных
-- 类目
create table `product_category` (
`category_id` int not null auto_increment,
`category_name` varchar(64) not null comment '类目名字',
`category_type` int not null comment '类目编号',
`create_time` timestamp not null default current_timestamp comment '创建时间',
`update_time` timestamp not null default current_timestamp on update current_timestamp comment '修改时间',
primary key (`category_id`),
unique key `uqe_category_type` (`category_type`)
);
INSERT INTO `product_category` (`category_id`, `category_name`, `category_type`, `create_time`, `update_time`)
VALUES
(1,'热榜',11,'2017-03-28 16:40:22','2017-11-26 23:39:36'),
(2,'好吃的',22,'2017-03-14 17:38:46','2017-11-26 23:39:40');
-- 商品
create table `product_info` (
`product_id` varchar(32) not null,
`product_name` varchar(64) not null comment '商品名称',
`product_price` decimal(8,2) not null comment '单价',
`product_stock` int not null comment '库存',
`product_description` varchar(64) comment '描述',
`product_icon` varchar(512) comment '小图',
`product_status` tinyint(3) DEFAULT '0' COMMENT '商品状态,0正常1下架',
`category_type` int not null comment '类目编号',
`create_time` timestamp not null default current_timestamp comment '创建时间',
`update_time` timestamp not null default current_timestamp on update current_timestamp comment '修改时间',
primary key (`product_id`)
);
INSERT INTO `product_info` (`product_id`, `product_name`, `product_price`, `product_stock`, `product_description`, `product_icon`, `product_status`, `category_type`, `create_time`, `update_time`)
VALUES
('157875196366160022','皮蛋粥',0.01,39,'好吃的皮蛋粥','//fuss10.elemecdn.com/0/49/65d10ef215d3c770ebb2b5ea962a7jpeg.jpeg',0,1,'2017-03-28 19:39:15','2017-07-02 11:45:44'),
('157875227953464068','慕斯蛋糕',10.90,200,'美味爽口','//fuss10.elemecdn.com/9/93/91994e8456818dfe7b0bd95f10a50jpeg.jpeg',1,1,'2017-03-28 19:35:54','2017-04-21 10:05:57'),
('164103465734242707','蜜汁鸡翅',0.02,982,'好吃','//fuss10.elemecdn.com/7/4a/f307f56216b03f067155aec8b124ejpeg.jpeg',0,1,'2017-03-30 17:11:56','2017-06-24 19:20:54');
-- 订单
create table `order_master` (
`order_id` varchar(32) not null,
`buyer_name` varchar(32) not null comment '买家名字',
`buyer_phone` varchar(32) not null comment '买家电话',
`buyer_address` varchar(128) not null comment '买家地址',
`buyer_openid` varchar(64) not null comment '买家微信openid',
`order_amount` decimal(8,2) not null comment '订单总金额',
`order_status` tinyint(3) not null default '0' comment '订单状态, 默认为新下单',
`pay_status` tinyint(3) not null default '0' comment '支付状态, 默认未支付',
`create_time` timestamp not null default current_timestamp comment '创建时间',
`update_time` timestamp not null default current_timestamp on update current_timestamp comment '修改时间',
primary key (`order_id`),
key `idx_buyer_openid` (`buyer_openid`)
);
-- 订单商品
create table `order_detail` (
`detail_id` varchar(32) not null,
`order_id` varchar(32) not null,
`product_id` varchar(32) not null,
`product_name` varchar(64) not null comment '商品名称',
`product_price` decimal(8,2) not null comment '当前价格,单位分',
`product_quantity` int not null comment '数量',
`product_icon` varchar(512) comment '小图',
`create_time` timestamp not null default current_timestamp comment '创建时间',
`update_time` timestamp not null default current_timestamp on update current_timestamp comment '修改时间',
primary key (`detail_id`),
key `idx_order_id` (`order_id`)
);
-- 用户
CREATE TABLE `user_info` (
`id` varchar(32) NOT NULL,
`username` varchar(32) DEFAULT '',
`password` varchar(32) DEFAULT '',
`openid` varchar(64) DEFAULT '' COMMENT '微信openid',
`role` tinyint(1) NOT NULL COMMENT '1买家2卖家',
`create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',
PRIMARY KEY (`id`)
);