Торговый центр Чангоу (1): Окружающая среда Строительство
усердно учись, совершенствуйся каждый день
Эта статья была включена в мой репозиторий Github.DayDayUP:GitHub.com/Роб О.Д. Ли/DA…, добро пожаловать в Звезду
- Торговый центр Чангоу (1): Окружающая среда Строительство
- Changyou Mall (2): распределенная файловая система FastDFS
- Торговый центр Best Buy (3): Управление сырьевыми товарами
- Changbu Mall (4): Lua, OpenResty, Canal реализуют кеширование и синхронизацию рекламы.
- Changshou Mall (5): Elasticsearch реализует поиск товаров
- Торговый центр Чаншоу (6): Поиск продукта
- Changbu Mall (7): Thymeleaf реализует статические страницы
- Торговый центр Чангоу (8): шлюз микросервисов и токен JWT
- Торговый центр Best Buy (9): Spring Security Oauth2
- Торговый центр (10): Корзина для покупок
- Торговый центр ЧанШоу (11): Заказы
- Торговый центр Чангоу (12): доступ к WeChat Pay
- Торговый центр Best Buy (13): система Seckill включена
- Торговый центр Best Buy (14): система Seckill "Next"
несколько слов
Торговый центр Chang — проект Dark Horse. Чтобы сказать, насколько сложен этот проект, определенно не составит большого труда следить за видео, но оно может дать мне представление о конкретном процессе разработки проекта и улучшить мои навыки использования ряда фреймворков, что также является целью мой проект. Информацию об этом проекте приводить не буду.Он есть на видеостанции б, а вспомогательная информация так же есть в комментариях под видео.Друзья, кому это нужно, могут зайти прямо на станцию б и найти. Далее я буду использовать десяток статей для записи процесса разработки всего проекта и возникших проблем.
Введение в проект торгового центра Чангоу
Проект Changgou Mall — это веб-сайт электронной коммерции B2C, который использует архитектуру микросервисов и развивается с разделением клиентской и серверной частей.
стек технологий
На картинке выше показан стек технологий, используемый Changgou Mall.Как видно из рисунка, разработка всего микросервиса основана на SpringBoot, для операций авторизации используется OAuth2.0, а для инкапсуляции авторизационной информации пользователя используется JWT. ., Spring AMQP — это протокол очереди сообщений. Затем идет набор микросервисных фреймворков Spring Cloud.
Стек технологии Persistence выбран MyBatis + Universal Mapper, но я не собираюсь использовать обычный Mapper, потому что я хочу тренировать операторы записи SQL, SQL обычно не как писать, они используют возможность практиковаться, чтобы практиковаться. Также использует SpringDataE, используемые для работы с ElasticSearch, SpringDataRedis, используемые для работы с Redis.
База данных использует MySQL, очередь сообщений использует RabbitMQ, а также реализовано разделение чтения и записи MySQL.
Платежный интерфейс выбирает оплату WeChat.
Технологическая архитектура
Это изображение представляет собой схему технической архитектуры торгового центра Changgou Mall, видно, что Nginx используется для балансировки нагрузки и ограничения тока, за которым следует шлюз микросервисов, который используется для маршрутизации запросов к различным микросервисам, а шлюз также объединяет функции текущего ограничения и проверки разрешений. Ниже приведены конкретные микросервисы. Бизнес-аспект разделен на 7 микросервисов. Микросервисы также могут вызывать друг друга. Feign используется для вызова между различными микросервисами. Некоторые JavaBeans и классы инструментов также извлекаются отдельно. Некоторые микросервисы общих компонентов также извлекаются отдельно, например микросервисы Oauth2.0, микросервисы RabbitMQ и т. д.
Hystrix Dashboard служит центром мониторинга, а Eureka — центром регистрации микросервисов.
Что касается поддержки данных, ElasticSearch используется для функции поиска, FastDFS — для файловой системы, MySQL — для базы данных, а Redis — для кэша.
Многие из них я раньше не использовал, и я не знаю точно, что они делают, поэтому введение простое.
Строительство окружающей среды
После того, как проект представлен, давайте начнем строить проект.
Установите виртуальную машину и подготовьте базу данных
База данных MySQL, которую мы используем, установлена в докере, а докер установлен на CentOS. Они были установлены. Нам нужно только установить виртуальную машину, предоставленную темной лошадкой. Процесс установки очень прост, но обязательно помните после завершения установкиИзменить IP, поскольку статический IP-адрес виртуальной машины и нашего собственного компьютера могут не находиться в одном сегменте сети, измените его на сегмент сети. Другая проблема заключается в том, что Navicat не может подключиться к базе данных, возможная причина в том, что数据库密码不对
Сказал, что видео 123456, я попробовал рут; или есть没有允许远程访问
, просто включите его; последняя причина防火墙不允许我们访问3306端口
, можно отключить брандмауэр.
Строительство каркаса проекта
1. Создайте родительский проект
Создайте новый модуль с именем changou-parent в каталоге changou в качестве родительского проекта всего проекта:
Нет необходимости писать код в родительском проекте, поэтомуУдалить каталог SRC. Поскольку каждый микросервисный проект — это SpringBoot, поэтомуДобавьте начальные зависимости SpringBoot в pom-файл changgou-parent.. после этогоДобавьте некоторые необходимые зависимости, зависимость swagger также добавлена в видео, но она пока не готова к использованию и будет добавлена по мере использования. Я вставляю содержимое всего pom-файла changgou-parent ниже:
<?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>
<groupId>com.robod</groupId>
<artifactId>changgou-parent</artifactId>
<version>1.0-SNAPSHOT</version>
<description>
畅购商城项目的父工程
</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.4.RELEASE</version>
</parent>
<properties>
<!-- 跳过测试 -->
<skipTests>true</skipTests>
</properties>
<!--依赖包-->
<dependencies>
<!--测试包-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
<!--fastjson-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.51</version>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Greenwich.SR1</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
</project>
2. Строительство нескольких других общественных модулей
под чангоу-родителемСоздайте четыре модуля: changgou-gateway, changgou-service, changgou-service-api и changgou-web., потому что это родительские проекты каждого модуля, поэтому нет необходимости писать код,Удалите каталог src и введите пакет pom..
<packaging>pom</packaging>
3. Построение микросервиса Eureka
Проект микросервиса создан, и теперь нам нужен реестр для запуска микросервиса, поэтому следующий шаг — под changgou-parent.Создайте модуль с именем changgou-eureka, чтобы запустить службу eureka, вам нужноДобавьте соответствующие зависимости.
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
</dependencies>
следующийДобавьте файл конфигурации application.yml в каталог ресурсов.:
server:
port: 7001 #端口号
eureka:
instance:
hostname: 127.0.0.1 #ip
client:
register-with-eureka: false #是否将自己注册到eureka中
fetch-registry: false #是否从eureka中获取信息
service-url:
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
spring:
application:
name: eureka
наконецДобавьте класс запуска в пакет Java: com.robod.EurekaApplication:
@SpringBootApplication
@EnableEurekaServer //开启Eureka服务
public class EurekaApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaApplication.class,args);
}
}
Теперь давайте проверим, может ли Eureka успешно запуститься, запустите приведенный выше код, подождите, пока проект запустится, посетитеhttp://127.0.0.1:7001
Вышеупомянутый интерфейс появляется успешно, указывая на то, что наш регистрационный центр был успешно построен👍
4. Создайте общий проект
Разные микросервисы будут использовать одни и те же классы инструментов. Мы выделяем эти классы инструментов в отдельный подпроект.Создайте новый модуль под changgou-parent с именем changgou-common.,Добавьте необходимые зависимости в файл pom.
<dependencies>
<!--web起步依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- redis 使用-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!--eureka-client-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<!--openfeign-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<!--微信支付-->
<dependency>
<groupId>com.github.wxpay</groupId>
<artifactId>wxpay-sdk</artifactId>
<version>0.0.3</version>
</dependency>
<!--httpclient支持-->
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
</dependency>
</dependencies>
Наконец, добавьте несколько классов инструментов в пакет com.robod.entity.(Эти классы доступны во вспомогательных материалах):
5. Создание проекта базы данных
Этот проект представляет собой сводку некоторых зависимостей, которым требуется доступ к базе данных, без кода, под chnaggou-parent.Создайте новый модуль с именем changgou-common-db.,Потомудалить каталог src,наконецДобавьте необходимые зависимости:
<!--依赖-->
<dependencies>
<!--对changgou-common的依赖-->
<dependency>
<groupId>com.robod</groupId>
<artifactId>changgou-common</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<!--通用mapper起步依赖,我不需要,所以没有添加这个-->
<!-- <dependency>-->
<!-- <groupId>tk.mybatis</groupId>-->
<!-- <artifactId>mapper-spring-boot-starter</artifactId>-->
<!-- <version>2.0.4</version>-->
<!-- </dependency>-->
<!--MySQL数据库驱动-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!--mybatis分页插件-->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.2.3</version>
</dependency>
</dependencies>
Товарная микросервисная инженерия
1. Проект JavaBean для массовых микросервисов
Ранее мы создали changgou-service-api для управления извлечением API из всех проектов микросервисов.Создайте проект changogu-service-goods-api под changgou-service-api для управления JavaBeans для массовых микросервисов., чтобы упростить код, нам нужно использовать Lombok,Добавьте зависимость Lombok в файл pom changgou-service-api.:
<dependencies>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.10</version>
<scope>provided</scope>
</dependency>
</dependencies>
потомПоместите необходимые нам компоненты JavaBeans в пакет com.robod.goods.pojo..
2. Создайте товарный микросервисный проект changgou-service-goods
Создайте changgou-service-goods под changgou-service как проект товарного микросервиса., потому что мы хотим использовать что-то, что подключается к базе данных, поэтому мыВнедрить changgou-common-db в changgou-service:
<dependency>
<groupId>com.robod</groupId>
<artifactId>changgou-common-db</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
Файлы конфигурации, естественно, незаменимы для проектов микросервисов.Создайте application.yml в каталоге ресурсов:
server:
port: 18081
spring:
application:
name: goods
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://192.168.31.200:3306/changgou_goods?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC
username: root
password: root
eureka:
client:
service-url:
defaultZone: http://127.0.0.1:7001/eureka
instance:
prefer-ip-address: true
feign:
hystrix:
enabled: true
Наконец для этого проектаСоздайте класс запуска com.robod.GoodsApplication:
@SpringBootApplication
@EnableEurekaClient //开启Eureka客户端
@MapperScan("com.robod.mapper") //开启包扫描
@EnableTransactionManagement //事务管理
public class GoodsApplication {
public static void main(String[] args) {
SpringApplication.run(GoodsApplication.class, args);
}
}
Чтобы начать проект, посетитеhttp://127.0.0.1:7001.
Видно, что товарный микросервисный проект успешно запущен и зарегистрирован в Eureka.
3. Запросите все реализации функций бренда
Создайте классы, соответствующие слою контроллера, слою службы и слою Dao соответственно:
Напишите соответствующий код:
@Repository("brandMapper")
public interface BrandMapper {
/**
* 查询所有的品牌信息
* @return
*/
@Select("select * from tb_brand")
public List<Brand> findAll();
}
-------------------------------------------------------
@Service("brandService")
@Transactional(rollbackFor = Exception.class) //异常回滚
public class BrandServiceImpl implements BrandService {
private final BrandMapper brandMapper;
public BrandServiceImpl(BrandMapper brandMapper) {
this.brandMapper = brandMapper;
}
@Override
public List<Brand> findAll() {
return brandMapper.findAll();
}
}
---------------------------------------------------------
@RestController
@RequestMapping("/brand")
@CrossOrigin
public class BrandController {
private final BrandService brandService;
public BrandController(BrandService brandService) {
this.brandService = brandService;
}
@GetMapping
public Result<List<Brand>> findAll() {
List<Brand> brands = brandService.findAll();
return new Result<>(true, StatusCode.OK,"查询成功",brands);
}
}
Затем запустите проект и получите доступhttp://localhost:18081/brand
Вся информация о бренде успешно запрашивается, что указывает на то, что наша среда была успешно построена. Остальные функции, такие как изменение бренда и удаление бренда, могут быть записаны напрямую. Если нет, очень вероятно, что есть проблема с кодом, не окружающая среда.
4. Пагинация + условный запрос
Для пейджинговых запросов нам нужно использовать PageHelper, который мы добавили ранее. Перейдите непосредственно к коду:
public PageInfo<Brand> findPage(Brand brand, int page, int size) {
PageHelper.startPage(page,size);
List<Brand> brands = brandMapper.findList(brand);
return new PageInfo<>(brands);
}
очень просто, во-первыхPageHelper.startPage(page,size), page — данные страницы, которые необходимо получить, size — количество фрагментов данных на странице;Вызовите метод, чтобы получить все данные;наконецИспользуйте PageInfo для инкапсуляции данныхВот и все.
Условные запросы должны динамически создавать операторы SQL на основе условий:
@SelectProvider(type = BrandMapperProvider.class, method = "findList")
public List<Brand> findList(Brand brand);
class BrandMapperProvider {
public String findList(Brand brand) {
StringBuilder builder = new StringBuilder("select * from tb_brand where ");
if (!StringUtils.isEmpty(brand.getName())) {
builder.append(" name like ").append("\"%").append(brand.getName()).append("%\" ");
}
if (!StringUtils.isEmpty(brand.getImage())) {
builder.append(" and image like ").append("\"%").append(brand.getImage()).append("%\" ");
}
if (!StringUtils.isEmpty(brand.getLetter())) {
builder.append(" and letter = ").append(" \"").append(brand.getLetter()).append("\" ");
}
if (brand.getSeq() != null) {
builder.append(" and seq = ").append(brand.getSeq());
}
System.out.println(builder.toString());
return builder.toString();
}
}
существуетДобавьте внутренний класс BrandMapperProvider в BrandMapper.,а такжеПредоставляет способ построения операторов SQL,наконецДобавьте аннотацию @SelectProvider в метод findList.Вот и все.
есть тест:
Успешно получили желаемый результат.
глобальная обработка исключений
Написание кода обработки исключений для каждого метода слишком хлопотно, вы можете использовать глобальный класс обработки исключений для обработки всех исключений. Поскольку все проекты микросервисов зависят от changgou-common, мы можем напрямуюСоздайте класс BaseExceptionHandler в пакете com.robod.exception в рамках проекта changgou-common..
@ControllerAdvice
public class BaseExceptionHandler {
/***
* 异常处理
* @param e
* @return
*/
@ExceptionHandler(value = Exception.class)
@ResponseBody
public Result error(Exception e) {
e.printStackTrace();
return new Result(false, StatusCode.ERROR, e.getMessage());
}
}
Добавьте аннотацию @ControllerAdvice над классом., тут эффектПрименить ко всем @RequestMappings для реализации глобальной обработки исключений, эта аннотация также может реализовывать функции глобальной привязки данных и предварительной обработки глобальных данных. над методом ошибкиДобавить аннотацию @ExceptionHandler(value=Exception.class), используемый для объявления типа исключения, которое необходимо перехватить. наконецНапишите код обработки исключений в методе ошибки.
резюме
В этой статье в основном представлена структура торгового центра Changgou Mall и построение среды, а затем написан проект товарного микросервиса и реализована функция добавления, удаления, проверки и изменения таблицы брендов. Наконец, мы также реализовали функцию глобальной обработки исключений.В следующей статье мы напишем о процессе построения среды fastDFS распределенной файловой системы и некоторых проблемах, с которыми столкнулись.
Нелегко закодировать слова, если можешь, дай мне одно
点赞
,收藏
,关注
Если вам нравятся мои статьи, добро пожаловать в публичный аккаунт WeChat."Р о б о д"
Код:GitHub.com/Роб О.Д. Ли/Ешь…
Эта статья была включена в мой репозиторий Github.DayDayUP:GitHub.com/Роб О.Д. Ли/DA…, добро пожаловать в Звезду