目录
1、微服务介绍
1.1.微服务架构介绍
1.2.微服务架构的常见问题
1.3.微服务架构的常见解决方案
1.3.1.ServiceComb
1.3.2.SpringCloud
1.3.3.SpringCloud Alibaba
2、微服务环境搭建
2.1案例准备
技术选项:
模块设计:
微服务调用:
2.2.创建父工程
2.3.创建基础模块
2.3.1. 创建实体类
2.4.创建用户微服务
2.5.创建商品微服务
shop-product:
productController:
applicat.yml
2.6.创建订单微服务
2.7.启动工程,通过浏览器访问服务进行测试
1、微服务介绍
1.1.微服务架构介绍
微服务架构,简单的说就是将单体应用进一步拆分,拆分成更小的服务,每个服务都是一个可以独 立运行的项目
1.2.微服务架构的常见问题
一旦采用微服务系统架构,就势必会遇到这样几个问题:
1.这么多小服务,如何管理他们?(服务治理 注册中心[服务注册 发现 剔除])
2.这么多小服务,他们之间如何通讯?(restful rpc)
3.这么多小服务,客户端怎么访问他们?(网关)
4.这么多小服务,一旦出现问题了,应该如何自处理?(容错)
5.这么多小服务,一旦出现问题了,应该如何排错? (链路追踪)
对于上面的问题,是任何一个微服务设计者都不能绕过去的,因此大部分的微服务产品都针对每一 个问题提供了相应的组件来解决它们
1.3.微服务架构的常见解决方案
1.3.1.ServiceComb
Apache ServiceComb,前身是华为云的微服务引擎 CSE (Cloud Service Engine) 云服务,是全球 首个Apache微服务顶级项目。它提供了一站式的微服务开源解决方案,致力于帮助企业、用户和开发 者将企业应用轻松微服务化上云,并实现对微服务应用的高效运维管理
1.3.2.SpringCloud
Spring Cloud是一系列框架的集合。它利用Spring Boot的开发便利性巧妙地简化了分布式系统基 础设施的开发,如服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等,都可以用 Spring Boot的开发风格做到一键启动和部署
Spring Cloud并没有重复制造轮子,它只是将目前各家公司开发的比较成熟、经得起实际考验的服 务框架组合起来,通过Spring Boot风格进行再封装屏蔽掉了复杂的配置和实现原理,最终给开发者留 出了一套简单易懂、易部署和易维护的分布式系统开发工具包
Hoxton.SR9
2020-11-09
Spring Cloud Starter Build Hoxton.SR9
Spring Cloud Aws 2.2.5.RELEASE
Spring Cloud Vault 2.2.6.RELEASE
Spring Cloud Sleuth 2.2.6.RELEASE
Spring Cloud Contract 2.2.5.RELEASE
Spring Cloud Kubernetes 1.1.7.RELEASE
Spring Cloud Config 2.2.6.RELEASE
Spring Cloud Openfeign 2.2.6.RELEASE
Spring Cloud Commons 2.2.6.RELEASE
Spring Cloud Zookeeper 2.2.4.RELEASE
Spring Cloud Consul 2.2.5.RELEASE
Spring Cloud Gcp 1.2.6.RELEASE
Spring Cloud Netflix 2.2.6.RELEASE
Spring Cloud Gateway 2.2.6.RELEASE
Spring Cloud Cli 2.2.3.RELEASE
1.3.3.SpringCloud Alibaba
Spring Cloud Alibaba 致力于提供微服务开发的一站式解决方案。此项目包含开发分布式应用微服 务的必需组件,方便开发者通过 Spring Cloud 编程模型轻松使用这些组件来开发分布式应用服务。 依托 Spring Cloud Alibaba,您只需要添加一些注解和少量配置,就可以将 Spring Cloud 应用接 入阿里微服务解决方案,通过阿里中间件来迅速搭建分布式应用系统
参考网站:
Spring Cloud AlibabaLevel up your Java code and explore what Spring can do for you.https://spring.io/projects/spring-cloud-alibaba
https://github.com/alibaba/spring-cloud-alibaba/blob/master/README-zh.mdhttps://github.com/alibaba/spring-cloud-alibaba/blob/master/README-zh.md
2、微服务环境搭建
2.1案例准备
技术选项:
maven:3.5.4
数据库:MySQL 5.7
持久层: SpingData Jpa/Mybatis-plus
其他: SpringCloud Alibaba 技术栈
模块设计:
springcloud-shop父工程
shop-common 公共模块【实体类】
shop-user 用户微服务 【端口: 807x】
shop-product 商品微服务 【端口: 808x】
shop-order 订单微服务 【端口: 809x】
微服务调用:
在微服务架构中,最常见的场景就是微服务之间的相互调用。我们以电商系统中常见的用户下单为 例来演示微服务的调用:客户向订单微服务发起一个下单的请求,在进行保存订单之前需要调用商品微 服务查询商品的信息
我们一般把服务的主动调用方称为服务消费者,把服务的被调用方称为服务提供者
在这种场景下,订单微服务就是一个服务消费者, 商品微服务就是一个服务提供者
2.2.创建父工程
创建一个maven工程,然后在pom.xml文件中添加下面内容
<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.zking</groupId>
<artifactId>springcloud-alibaba</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>pom</packaging>
<!--依赖版本的锁定-->
<properties>
<java.version>1.8</java.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<spring-boot.version>2.3.2.RELEASE</spring-boot.version>
<spring-cloud.version>Hoxton.SR9</spring-cloud.version>
<spring-cloud-alibaba.version>2.2.6.RELEASE</spring-cloud-alibaba.version>
</properties>
<dependencyManagement>
<dependencies>
<!-- SpringBoot 依赖配置 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring-boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
</project>
版本对应:
版本说明 · alibaba/spring-cloud-alibaba Wiki · GitHubSpring Cloud Alibaba provides a one-stop solution for application development for the distributed solutions of Alibaba middleware. - 版本说明 · alibaba/spring-cloud-alibaba Wikihttps://github.com/alibaba/spring-cloud-alibaba/wiki/%E7%89%88%E6%9C%AC%E8%AF%B4%E6%98%8E
2.3.创建基础模块
shop-common
导入所需pom依赖
<!--依赖-->
<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.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.56</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.44</version>
</dependency>
</dependencies>
在我们创建完这个基础模块之后,可以看见自动添加父模块
对应的父模块也添加了基础模块
2.3.1. 创建实体类
用户:
package com.zwc.model;
import lombok.Data;
//用户
@Data//不再去写set和get方法
@NoArgsConstructor
@AllArgsConstructor
public class User {
private Integer uid;//主键
private String username;//用户名
private String password;//密码
private String telephone;//手机号
}
商品:
package com.zwc.model;
import lombok.Data;
//商品
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Product {
private Integer pid;//主键
private String pname;//商品名称
private Double pprice;//商品价格
private Integer stock;//库存
}
订单:
package com.zwc.model;
import lombok.Data;
//订单
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Order {
private Long oid;//订单id
//用户
private Integer uid;//用户id
private String username;//用户名
//商品
private Integer pid;//商品id
private String pname;//商品名称
private Double pprice;//商品单价
//数量
private Integer number;//购买数量
}
2.4.创建用户微服务
所需步骤:
1 创建模块 导入依赖
2 创建SpringBoot主类
3 加入配置文件
4 创建必要的接口和实现类(controller service dao) 新建一个shop-user 模块,然后进行下面操作
对下面pom文件进行更改
再添加继承父模块的代码,我们直接去common工程拷贝就行
对应的pom文件进行更改
<dependencies>
<!--springboot-web-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--引入基础版块 shop-common-->
<dependency>
<groupId>com.oyang</groupId>
<artifactId>shop-common</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
接下来创建的商品以及订单微服务和用户微服务步骤一模一样
2.5.创建商品微服务
shop-product:
pom依赖:
<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>spcloud-shop</artifactId>
<groupId>com.cdl</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>shop-product</artifactId>
<dependencies>
<!--springboot-web-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--shop-common-->
<dependency>
<groupId>com.cdl</groupId>
<artifactId>shop-common</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
</project>
productController:
package com.zwc.shopproduct.Controller;
import com.zwc.model.Product;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @author zwc
* @site www.zwc.com
* @create 2022-12-29 13:12
*/
@RestController
@RequestMapping("/product")
public class ProductCtroller {
@RequestMapping("/get/{pid}")
public Product get(@PathVariable("pid") Integer pid){
return new Product(pid,"西游记",6d,20);
}
}
applicat.yml
spring:
application:
name: shop-product
server:
port: 8080
2.6.创建订单微服务
pom依赖:
<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>spcloud-shop</artifactId>
<groupId>com.cdl</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>shop-order</artifactId>
<dependencies>
<!--springboot-web-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--shop-common-->
<dependency>
<groupId>com.cdl</groupId>
<artifactId>shop-common</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
</project>
OrderController:
package com.zwc.shoporder.Controller;
import com.zwc.model.Order;
import com.zwc.model.Product;
import com.zwc.model.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
/**
* @author zwc
* @site www.zwc.com
* @create 2022-12-29 14:43
*/
@RestController
@RequestMapping("/order")
public class OrderCtroller {
@Autowired
private RestTemplate restTemplate;
@RequestMapping("/get/{uid}/{pid}")
public Order get(@PathVariable("uid") Integer uid,
@PathVariable("pid") Integer pid){
//要在订单微服务中调用 用户微服务、商品微服务 跨项目调用
User user = restTemplate.getForObject("http://localhost:8070/user/get/" + uid, User.class);
Product product = restTemplate.getForObject("http://localhost:8080/product/get/" + pid, Product.class);
Order order = new Order();
order.setUsername(user.getUsername());
order.setUid(user.getUid());
order.setPprice(product.getPprice());
order.setPname(product.getPname());
order.setPid(product.getPid());
order.setOid(System.currentTimeMillis());
order.setNumber(product.getStock());
return order;
}
}
启动类 ShopOrderApplication :
package com.zwc.shoporder;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;
@SpringBootApplication
public class ShopOrderApplication {
public static void main(String[] args) {
SpringApplication.run(ShopOrderApplication.class, args);
}
@Bean
public RestTemplate restTemplate(){
return new RestTemplate();
}
}
application.yml
spring:
application:
name: shop-order
server:
port: 8090
2.7.启动工程,通过浏览器访问服务进行测试
用户微服务
商品微服务:
订单微服务调用其他微服务 :
——————————————今天的内容就到这了!!!