苏州专业网站建设,百度的搜索引擎优化,36岁了初中毕业想提升学历,源码站用dz wordpress组件
服务注册和发现
微服务模块中#xff0c;一般是以集群的方式进行部署的#xff0c;如果我们调用的时候以硬编码的方式#xff0c;那么当服务出现问题、服务扩缩容等就需要对代码进行修改#xff0c;这是非常不好的。所以微服务模块中就出现了服务注册和发现组件一般是以集群的方式进行部署的如果我们调用的时候以硬编码的方式那么当服务出现问题、服务扩缩容等就需要对代码进行修改这是非常不好的。所以微服务模块中就出现了服务注册和发现组件比较常用的组件有Eureka、Consul、Nacos在微服务系列中也是针对这三个组件来进行介绍。
负载均衡
由于以集群的方式部署因此我们就要考虑调用哪台机子的问题所以微服务模块中又出现了负载均衡组件 在微服务系列中针对LoadBalancer组件进行介绍。
分布式配置管理
微服务导致会出现大量的服务而每个服务都需要必要的配置此时就迫切需要一套集中式的、动态的配置管理设施在微服务系列中针对Consul、Nacos组件进行介绍。
网关
微服务的出现导致大量的服务从而导致大量的IP地址这对前端是不友好的。但是本着脏话累活后端来干的优良品质因此又出现了一系列的组件来解决这个问题在微服务系列中针对Gateway组件进行介绍。
服务调用
单体项目中想要调用别的业务只需要注入即可但是在微服务中业务进行拆分因此无法通过注入的方式来进行调用。不过例如RestTemplate、HttpClient等都是可以进行URL发送的但是这种方式也会造成硬编码的出现。于是微服务又出现了一系列组件来解决这个问题 在微服务系列中针对OpenFeign组件进行介绍。
服务链路追踪
微服务应用中可能一个业务的完成就需要调用N个服务如果该业务效率低下、响应结果错误。我们就需要去定位是哪里的响应慢、哪里的服务出现错误但是靠肉眼是没法看出来的。因此微服务又出现了组件来对一次调用的链路进行记录从而可以在出现问题后快速解决问题。 在微服务系列中针对Micrometer Tracing组件进行介绍。
服务熔断和降级
微服务的出现本来就是为了解决单体项目资源不足的情况因此当流量过多或者服务出错时我们就要采取降低流量等措施对于这种问题 在微服务系列中针对Circuit Breaker和Sentinel组件进行介绍。
分布式事务
单体应用中我们经常要用到事务微服务应用也不例外因此对于这种应用场景。 在微服务系列中针对Seata组件进行介绍。 在微服务系列中基本上就是对上述组件的介绍不会涉及太多的底层原因主要是介绍如何进行操作后续有实力之后再对其源码进行分析介绍。 基础工程构建
业务场景 以订单服务调用商品服务为例来对SpringCloud的一系列组件进行介绍。
数据准备
-- 建库商品库
create database if not exists cloud_product charset utf8mb4;
-- 使用库
use cloud_product;
-- 产品表
DROP TABLE IF EXISTS product_detail;
CREATE TABLE product_detail (
id BIGINT NOT NULL AUTO_INCREMENT COMMENT 产品id,
product_name varchar ( 128 ) NULL COMMENT 产品名称,
product_price BIGINT ( 20 ) NOT NULL COMMENT 产品价格,
state TINYINT ( 4 ) NULL DEFAULT 0 COMMENT 产品状态 0-有效 1-下架,
create_time DATETIME DEFAULT now(),
update_time DATETIME DEFAULT now(),
PRIMARY KEY ( id )) ENGINE INNODB DEFAULT CHARACTER
SET utf8mb4 COMMENT 产品表;
-- 数据初始化
insert into product_detail (id, product_name,product_price,state)
values
(1001,T恤, 101, 0), (1002, 短袖,30, 0), (1003, 短裤,44, 0),
(1004, 卫⾐,58, 0), (1005, ⻢甲,98, 0),(1006,⽻绒服, 101, 0),
(1007, 冲锋⾐,30, 0), (1008, 袜⼦,44, 0), (1009, 鞋⼦,58, 0),
(10010, ⽑⾐,98, 0);
-- 建库订单库
create database if not exists cloud_order charset utf8mb4;
-- 使用库
use cloud_order;
-- 订单表
DROP TABLE IF EXISTS order_detail;
CREATE TABLE order_detail (id BIGINT NOT NULL AUTO_INCREMENT COMMENT 订单id,user_id BIGINT ( 20 ) NOT NULL COMMENT ⽤⼾ID,product_id BIGINT ( 20 ) NULL COMMENT 产品id,num INT ( 10 ) NULL DEFAULT 0 COMMENT 下单数量,price BIGINT ( 20 ) NOT NULL COMMENT 实付款,delete_flag TINYINT ( 4 ) NULL DEFAULT 0,create_time DATETIME DEFAULT now(),update_time DATETIME DEFAULT now(),
PRIMARY KEY ( id )) ENGINE INNODB DEFAULT CHARACTER
SET utf8mb4 COMMENT 订单表;
-- 数据初始化
insert into order_detail (user_id,product_id,num,price)
values
(2001, 1001,1,99), (2002, 1002,1,30), (2001, 1003,1,40),
(2003, 1004,3,58), (2004, 1005,7,85), (2005, 1006,7,94); 工程搭建
搭建父工程 ?xml version1.0 encodingUTF-8?
project xmlnshttp://maven.apache.org/POM/4.0.0xmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsdmodelVersion4.0.0/modelVersiongroupIdcom.wbz/groupIdartifactIdspring-cloud-test/artifactIdversion1.0-SNAPSHOT/versionpackagingpom/packagingmodulesmodulecloud-provider-payment8001/modulemodulecloud-consumer-order80/module/modulespropertiesmaven.compiler.source17/maven.compiler.sourcemaven.compiler.target17/maven.compiler.targetproject.build.sourceEncodingUTF-8/project.build.sourceEncodingspring-cloud.version2023.0.0/spring-cloud.versionspring-cloud-alibaba.version2022.0.0.0-RC2/spring-cloud-alibaba.versionmysql.version8.0.31/mysql.versiondruid.version1.2.18/druid.versionmybatis-plus.version3.5.7/mybatis-plus.versionlombok.version1.18.28/lombok.version/properties!--SpringBoot--parentgroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-parent/artifactIdversion3.2.0/versionrelativePath/ !-- lookup parent from repository --/parentdependencyManagementdependencies!--SpringCloud--dependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-dependencies/artifactIdversion${spring-cloud.version}/versiontypepom/typescopeimport/scope/dependency!--SpringCloudAlibaba--dependencygroupIdcom.alibaba.cloud/groupIdartifactIdspring-cloud-alibaba-dependencies/artifactIdversion${spring-cloud-alibaba.version}/versiontypepom/typescopeimport/scope/dependency!--MySQL驱动--dependencygroupIdcom.mysql/groupIdartifactIdmysql-connector-j/artifactIdversion${mysql.version}/version/dependency!--Druid--dependencygroupIdcom.alibaba/groupIdartifactIddruid-spring-boot-starter/artifactIdversion${druid.version}/version/dependency!--MP--dependencygroupIdcom.baomidou/groupIdartifactIdmybatis-plus-spring-boot3-starter/artifactIdversion${mybatis-plus.version}/version/dependency!--Lombok--dependencygroupIdorg.projectlombok/groupIdartifactIdlombok/artifactIdversion${lombok.version}/version/dependency/dependencies/dependencyManagement/project
搭建子工程 - 商品服务
在该业务背景下商品服务作为服务提供方出现。 搭建一个模块一般分为建模块、写pom文件、写yml文件、改主启动类、写业务类。 建模块 写pom文件
?xml version1.0 encodingUTF-8?
project xmlnshttp://maven.apache.org/POM/4.0.0xmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsdmodelVersion4.0.0/modelVersionparentgroupIdcom.wbz/groupIdartifactIdspring-cloud-test/artifactIdversion1.0-SNAPSHOT/version/parentartifactIdcloud-provider-product8001/artifactIdpropertiesmaven.compiler.source17/maven.compiler.sourcemaven.compiler.target17/maven.compiler.targetproject.build.sourceEncodingUTF-8/project.build.sourceEncoding/propertiesdependencies!--SpringBoot通用模块--dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId/dependency!--Lombok--dependencygroupIdorg.projectlombok/groupIdartifactIdlombok/artifactId/dependency!--Druid--dependencygroupIdcom.alibaba/groupIdartifactIddruid-spring-boot-starter/artifactId/dependency!--MySQL驱动--dependencygroupIdcom.mysql/groupIdartifactIdmysql-connector-j/artifactId/dependency!--MP--dependencygroupIdcom.baomidou/groupIdartifactIdmybatis-plus-spring-boot3-starter/artifactId/dependency/dependenciesbuildpluginsplugingroupIdorg.springframework.boot/groupIdartifactIdspring-boot-maven-plugin/artifactId/plugin/plugins/build/project 写yml文件
server:port: 8001spring:application:name: cloud-provider-payment8001mvc:pathmatch:matching-strategy: ant_path_matcher # 路径匹配策略datasource:url: jdbc:mysql://127.0.0.1:3306/cloud_product?characterEncodingutf8useSSLfalseallowPublicKeyRetrievaltrueallowMultiQueriestrueusername: rootpassword: rootdriver-class-name: com.mysql.cj.jdbc.Driverprofiles:active: devmybatis-plus:configuration:map-underscore-to-camel-case: truelog-impl: org.apache.ibatis.logging.stdout.StdOutImplmapper-locations: classpath:mapper/**Mapper.xmltype-aliases-package: com.wbz.domain 改主启动类
/*** 微服务生产者模块表示被调用的一方*/MapperScan(com.wbz.mapper)
SpringBootApplication
public class ProductProviderApplication8001 {public static void main(String[] args) {SpringApplication.run(ProductProviderApplication8001.class, args);}} 写业务类
// model
/*** 产品表*/Data
AllArgsConstructor
NoArgsConstructor
TableName(product_detail)
public class Product {TableIdprivate Long id;TableFieldprivate String productName;TableFieldprivate Long productPrice;TableFieldprivate Integer state;TableFieldJsonFormat(pattern yyyy-MM-dd HH:mm:ss, timezone GMT8)private LocalDateTime createTime;TableFieldJsonFormat(pattern yyyy-MM-dd HH:mm:ss, timezone GMT8)private LocalDateTime updateTime;}// 持久层接口
public interface ProduceMapper extends BaseMapperProduct {
}// 服务层接口
public interface ProductService extends IServiceProduct {Product getProductById(Long productId);}// 服务层实现类
Service
public class ProductServiceImpl extends ServiceImplProduceMapper, Product implements ProductService {Overridepublic Product getProductById(Long productId) {return this.getById(productId);}}// 控制层类
RestController
RequestMapping(/product)
public class ProductController {Resourceprivate ProductService productService;GetMapping(/query/{productId})public Product getProductById(PathVariable Long productId) {return this.productService.getProductById(productId);}}
启动项目之后访问url127.0.0.1:8001/product/query/1001返回如下页面就算调用成功 整体代码结构如下 搭建子工程 - 订单服务
在该业务背景下订单服务作为服务调用方出现。
建模块 写pom文件
?xml version1.0 encodingUTF-8?
project xmlnshttp://maven.apache.org/POM/4.0.0xmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsdmodelVersion4.0.0/modelVersionparentgroupIdcom.wbz/groupIdartifactIdspring-cloud-test/artifactIdversion1.0-SNAPSHOT/version/parentartifactIdcloud-consumer-order80/artifactIdpropertiesmaven.compiler.source17/maven.compiler.sourcemaven.compiler.target17/maven.compiler.targetproject.build.sourceEncodingUTF-8/project.build.sourceEncoding/propertiesdependencies!--SpringBoot通用模块--dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId/dependency!--Lombok--dependencygroupIdorg.projectlombok/groupIdartifactIdlombok/artifactId/dependency!--Druid--dependencygroupIdcom.alibaba/groupIdartifactIddruid-spring-boot-starter/artifactId/dependency!--MySQL驱动--dependencygroupIdcom.mysql/groupIdartifactIdmysql-connector-j/artifactId/dependency!--MP--dependencygroupIdcom.baomidou/groupIdartifactIdmybatis-plus-spring-boot3-starter/artifactId/dependency/dependenciesbuildpluginsplugingroupIdorg.springframework.boot/groupIdartifactIdspring-boot-maven-plugin/artifactId/plugin/plugins/build/project
写yml文件
server:port: 80spring:application:name: cloud-consumer-order80mvc:pathmatch:matching-strategy: ant_path_matcher # 路径匹配策略datasource:url: jdbc:mysql://127.0.0.1:3306/cloud_order?characterEncodingutf8useSSLfalseallowPublicKeyRetrievaltrueallowMultiQueriestrueusername: rootpassword: rootdriver-class-name: com.mysql.cj.jdbc.Driverprofiles:active: devmybatis-plus:configuration:map-underscore-to-camel-case: truelog-impl: org.apache.ibatis.logging.stdout.StdOutImplmapper-locations: classpath:mapper/**Mapper.xmltype-aliases-package: com.wbz.domain
改主启动类
/*** 微服务消费者模块调用的一方*/SpringBootApplication
MapperScan(com.wbz.mapper)
public class OrderConsumerApplication80 {public static void main(String[] args) {SpringApplication.run(OrderConsumerApplication80.class, args);}}
写业务类
// 实体类
Data
NoArgsConstructor
AllArgsConstructor
TableName(order_detail)
public class Order {TableIdprivate Long id;TableFieldprivate Long userId;TableFieldprivate Long productId;TableFieldprivate Integer num;TableFieldprivate Long price;TableFieldprivate Integer deleteFlag;TableFieldJsonFormat(pattern yyyy-MM-dd HH:mm:ss, timezone GMT8)private LocalDateTime createTime;TableFieldJsonFormat(pattern yyyy-MM-dd HH:mm:ss, timezone GMT8)private LocalDateTime updateTime;TableField(exist false)private Product product;}// mapper接口
public interface OrderMapper extends BaseMapperOrder {
}// service接口
public interface OrderService extends IServiceOrder {Order getOrderById(Integer id);}// RestTemplateConfig实现类
Configuration
public class RestTemplateConfig {Beanpublic RestTemplate restTemplate() {return new RestTemplate();}}// service实现类
Service
public class OrderServiceImpl extends ServiceImplOrderMapper, Order implements OrderService {Resourceprivate RestTemplate restTemplate;Overridepublic Order getOrderById(Integer id) {Order order this.getById(id);String url http://127.0.0.1:8001/product/query/ order.getProductId();Product product this.restTemplate.getForObject(url, Product.class);order.setProduct(product);return order;}}// controller实现类
RestController
RequestMapping(/order)
public class OrderController {Resourceprivate OrderService orderService;GetMapping(/query/{id})public Order getOrderById(PathVariable Integer id) {return this.orderService.getOrderById(id);}}
启动项目之后访问url127.0.0.1/order/query/1出现如下页面就算调用成功