2026/4/6 9:34:31
网站建设
项目流程
在线一键免费生成网页网站,建设景区网站要有的内容,画册设计1p一般多少钱,.flv 网站播放什么是微服务微小的服务#xff0c;没有明确边界#xff0c;通常情况下微服务只做一件事情分布式架构VS微服务架构单体架构#xff1a;运行整个服务分布式架构#xff1a;将服务拆分#xff0c;一般倾向于服务的分散化#xff0c;解决的是压力的缓解微服务架构#xff1…什么是微服务微小的服务没有明确边界通常情况下微服务只做一件事情分布式架构VS微服务架构单体架构运行整个服务分布式架构将服务拆分一般倾向于服务的分散化解决的是压力的缓解微服务架构将服务进行更细粒度的拆分一般为垂直拆分即一台服务器只做一项任务侧重于能力的分散化微服务架构的优势和挑战优势易开发和维护每个微服务体量小业务清晰开发维护成本低容错性高一个服务发生故障可以让故障被隔离在单个服务中不影响整体服务扩展性好每个服务单独运行可以自由增减服务技术选型灵活每个微服务都是单独的团队构建可以根据业务特点选择合适的技术栈甚至语言挑战服务依赖随着微服务数量变多服务治理变得困难运维成本一个微服务架构由多个团队共同完成需要更多的编译部署运行甚至不同的语言和环境也需要集群来处理故障转移对于运维人员而言挑战巨大服务监控在单体服务架构中我们很容易对服务进行监控但是微服务架构则更加困难负载均衡微服务中的服务实例数量庞大因此需要有效的负载均衡机制来管理请求流量和保证高可用性SpringCloudSpringCloud就是分布式微服务架构的一站式解决方案springcloud把一些比较优秀的解决微服务架构中的常用问题的开源框架基于SpringBoot框架进行整合并基于SpringBoot风格对这些组件进行了封装。SpringCloud实现对比SpringCloud工程搭建采用父子工程的搭建方式首先通过SpringBoot创建父工程只保留pom.xml文件配置文件需要根据个人进行修改这里提供适配作者的配置文件仅供参考?xml version1.0 encodingUTF-8? project xmlnshttp://maven.apache.org/POM/4.0.0 xmlns:xsihttp://www.w3.org/2001/XMLSchema-instance xsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd modelVersion4.0.0/modelVersion groupIdcom.spring/groupId artifactIdspringcloud-demo/artifactId version1.0-SNAPSHOT/version packagingpom/packaging !-- 子工程 -- modules moduleorder-service/module moduleproduct-service/module /modules !-- 父工程 -- parent groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-parent/artifactId version3.1.6/version relativePath/ !-- lookup parent from repository -- /parent properties maven.compiler.source17/maven.compiler.source maven.compiler.target17/maven.compiler.target java.version17/java.version mybatis.version3.0.3/mybatis.version mysql.version8.0.33/mysql.version spring-cloud.version2022.0.3/spring-cloud.version /properties !-- 依赖管理 -- dependencies dependency groupIdorg.projectlombok/groupId artifactIdlombok/artifactId optionaltrue/optional /dependency /dependencies !-- 依赖管理 -- dependencyManagement dependencies dependency groupIdorg.springframework.cloud/groupId artifactIdspring-cloud-dependencies/artifactId version${spring-cloud.version}/version typepom/type scopeimport/scope /dependency dependency groupIdorg.mybatis.spring.boot/groupId artifactIdmybatis-spring-boot-starter/artifactId version${mybatis.version}/version /dependency dependency groupIdcom.mysql/groupId artifactIdmysql-connector-j/artifactId version${mysql.version}/version /dependency dependency groupIdorg.mybatis.spring.boot/groupId artifactIdmybatis-spring-boot-starter-test/artifactId version${mybatis.version}/version scopetest/scope /dependency /dependencies /dependencyManagement /project随后通过new module的方式创建子工程在子工程中配置一系列配置文件pom.xml?xml version1.0 encodingUTF-8? project xmlnshttp://maven.apache.org/POM/4.0.0 xmlns:xsihttp://www.w3.org/2001/XMLSchema-instance xsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd modelVersion4.0.0/modelVersion parent groupIdcom.spring/groupId artifactIdspringcloud-demo/artifactId version1.0-SNAPSHOT/version /parent artifactIdproduct-service/artifactId properties maven.compiler.source17/maven.compiler.source maven.compiler.target17/maven.compiler.target project.build.sourceEncodingUTF-8/project.build.sourceEncoding /properties dependencies dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-web/artifactId /dependency dependency groupIdcom.mysql/groupId artifactIdmysql-connector-j/artifactId /dependency !--mybatis-- dependency groupIdorg.mybatis.spring.boot/groupId artifactIdmybatis-spring-boot-starter/artifactId /dependency /dependencies build plugins plugin groupIdorg.springframework.boot/groupId artifactIdspring-boot-maven-plugin/artifactId /plugin /plugins resources resource directorysrc/main/resources/directory filteringtrue/filtering includes include**/**/include /includes /resource /resources /build /projectapplication.ymlserver: port: 你自己的端口号注意每个子工程的端口号应保持不同 spring: datasource: url: jdbc:mysql://127.0.0.1:3306/cloud_product?characterEncodingutf8useSSLfalse username: 数据库用户名 password: 数据库密码 driver-class-name: com.mysql.cj.jdbc.Driver mybatis: mapper-locations: classpath:mapper/*Mapper.xml configuration: # 配置打印 MyBatis 执行的 SQL log-impl: org.apache.ibatis.logging.stdout.StdOutImpl map-underscore-to-camel-case: true #自动驼峰转换随后按照图片在子工程中搭建出SpringBoot的架构这样我们就搭建好了SpringCloud的简单架构。简单的微服务实现现在我们创建了两个基于SpringBoot的微服务8080: order-service和9090: product-service我们的目标是前端请求order-service微服务然后order-service微服务调用product-service微服务获取product的详细信息最后由order-service传回包括product的order详细信息。首先先完成基本的SpringBoot搭建此处以pruduct-service为例product类package com.spring.product.model; import lombok.Data; import java.util.Date; Data public class ProductInfo { private Integer id; private String productName; private Integer state; private Date createTime; private Date updateTime; }Controllerpackage com.spring.product.controller; import com.spring.product.model.ProductInfo; import com.spring.product.service.ProductService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; RestController RequestMapping(/product) public class ProductController { Autowired private ProductService productService; RequestMapping(/selectProductInfoByProductId) public ProductInfo selectProductInfoByProductId(Integer productId) { return productService.selectProductInfoById(productId); } }Servicepackage com.spring.product.service; import com.spring.product.mapper.ProductMapper; import com.spring.product.model.ProductInfo; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; Slf4j Service public class ProductService { Autowired private ProductMapper productMapper; public ProductInfo selectProductInfoById(Integer productId) { return productMapper.selectProductInfoById(productId); } }Mapperpackage com.spring.product.mapper; import com.spring.product.model.ProductInfo; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Select; Mapper public interface ProductMapper { Select(select * from product_detail where id #{productId}) ProductInfo selectProductInfoById(Integer productId); }同理搭建order-service。第二步创建RestTemplate类然后通过order-service调用product-service的接口实现数据的获取RestTemplate类package com.spring.order.config; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.client.RestTemplate; Configuration public class BeanConfig { Bean public RestTemplate restTemplate(){ return new RestTemplate(); } }order-service修改Service public class OrderService { Autowired private OrderMapper orderMapper; Autowired private RestTemplate restTemplate; public OrderInfo selectOrderInfoById(Integer orderId) { OrderInfo orderInfo orderMapper.selectOrderInfoById(orderId); //获取product-service的URL String urlhttp://127.0.0.1:9090/product/selectProductInfoByProductIdproductIdorderInfo.getProductId(); //通过restTemplate调用product-service接口获得product信息 ProductInfo productInfo restTemplate.getForObject(url, ProductInfo.class); //填充信息 orderInfo.setProductInfo(productInfo); return orderInfo; } }这样就完成了前端请求order-service——order-service调用product-service并返回的流程了。问题1. URL是写死的如果IP地址发生变化就需要修改代码2. 如果多机部署如何处理3. 返回结果如何公用4. 接口对外开放有一定风险上述问题我们将在接下来的文章中使用Eureka等服务注册中心解决