java 微服务学习笔记
- 基础
- [nacos 安装](#nacos 安装)
-
- [创建spring 工程](#创建spring 工程)
- 注册nacos显示查看
- 使用服务名:
- 封装成类的方式调用
- [nacos 配置](#nacos 配置)
- 网关gateway
-
- [nacos 配置 :gateway.yaml,文件内容如下;](#nacos 配置 :gateway.yaml,文件内容如下;)
- [添加gateway module](#添加gateway module)
- [更改pom.xml 依赖](#更改pom.xml 依赖)
- [更改application.properies 为application.yaml 文件,内容如下:](#更改application.properies 为application.yaml 文件,内容如下:)
- 注册服务
- [seata 分布式事物](#seata 分布式事物)
-
- 包依赖
- [stock-server.yaml 配置文件内容:](#stock-server.yaml 配置文件内容:)
- Sentinel
基础
spring :3.2.5
nacos 安装
从https://nacos.io/download/release-history/?spm=5238cd80.6a33be36.0.0.10651e5d5wZiXv 下载,nacos 2.3.2
- 创建数据库nacos,然后执行sql 文件(mysql-schema.sql)中的内容:
- 更改文件(startup.cmd)中的文件内容:把mode 更改成standalone
set MODE="standalone",
效果图如下:
- 更改配置:application.properties

- 启动
D:\workspace\java\nacos-server-2.3.2\bin>startup.cmd
效果图如下:

打开
创建spring 工程
- 创建父工程sc-springcloudalibaba
配置POM.xml
bash
<?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">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.5.13</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<!-- Generated by https://start.springboot.io -->
<!-- 优质的 spring/boot/data/security/cloud 框架中文文档尽在 => https://springdoc.cn -->
<groupId>com</groupId>
<artifactId>sc-springcloudalibaba</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>sc-springcloudalibaba</name>
<description>sc-springcloudalibaba</description>
<packaging>pom</packaging>
<modules>
<module>order</module>
<module>stock</module>
</modules>
<url/>
<licenses>
<license/>
</licenses>
<developers>
<developer/>
</developers>
<scm>
<connection/>
<developerConnection/>
<tag/>
<url/>
</scm>
<properties>
<java.version>21</java.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2023.0.1.0</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>2023.0.3</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
- 子工程order
1.controller/OrderController.java 文件内容如下:
bash
@RestController
@RequestMapping("/order")
public class OrderController {
//@Autowired
//RestTemplate restTemplate;
@RequestMapping("/add")
public String add(){
// 输出方法调用
System.out.println("下单成功");
String msg= "";
//msg = restTemplate.getForObject("http://localhost:8082/storage/deduct", String.class);
return "Hello World!"+msg;
}
}
2.更改启动类,加入标签:
@EnableDiscoveryClient
bash
package com.order;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;
// Generated by https://start.springboot.io
// 优质的 spring/boot/data/security/cloud 框架中文文档尽在 => https://springdoc.cn
@SpringBootApplication
@EnableDiscoveryClient
public class OrderApplication {
public static void main(String[] args) {
SpringApplication.run(OrderApplication.class, args);
}
@Bean
public RestTemplate getRestTemplate(){
return new RestTemplate();
}
}
3. pom.xml
bash
<?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">
<modelVersion>4.0.0</modelVersion>
<parent>
<!-- <groupId>org.springframework.boot</groupId>-->
<!-- <artifactId>spring-boot-starter-parent</artifactId>-->
<!-- <version>3.5.13</version>-->
<!-- <relativePath/>-->
<!-- lookup parent from repository -->
<groupId>com</groupId>
<artifactId>sc-springcloudalibaba</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<packaging>jar</packaging>
<!-- Generated by https://start.springboot.io -->
<!-- 优质的 spring/boot/data/security/cloud 框架中文文档尽在 => https://springdoc.cn -->
<groupId>com</groupId>
<artifactId>order</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>order</name>
<description>order</description>
<url/>
<licenses>
<license/>
</licenses>
<developers>
<developer/>
</developers>
<scm>
<connection/>
<developerConnection/>
<tag/>
<url/>
</scm>
<properties>
<java.version>21</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
- 子工程stock
1.StockController.java
bash
package com.stock.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.concurrent.TimeUnit;
@RestController
@RequestMapping("/stock")
public class StockController {
@RequestMapping("/reduct")
public String reduct() throws InterruptedException {
TimeUnit.SECONDS.sleep ( 1);
System.out.println("扣减库存");
return "扣减库存";
}
}
2.StockApplication.java
bash
package com.stock;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
// Generated by https://start.springboot.io
// 优质的 spring/boot/data/security/cloud 框架中文文档尽在 => https://springdoc.cn
@SpringBootApplication
@EnableDiscoveryClient
public class StockApplication {
public static void main(String[] args) {
SpringApplication.run(StockApplication.class, args);
}
}
3.pom.xml
bash
<?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">
<modelVersion>4.0.0</modelVersion>
<parent>
<!-- <groupId>org.springframework.boot</groupId>-->
<!-- <artifactId>spring-boot-starter-parent</artifactId>-->
<!-- <version>3.5.13.RELEASE</version>-->
<!-- <relativePath/> <!– lookup parent from repository –>-->
<groupId>com</groupId>
<artifactId>sc-springcloudalibaba</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<!-- Generated by https://start.springboot.io -->
<!-- 优质的 spring/boot/data/security/cloud 框架中文文档尽在 => https://springdoc.cn -->
<groupId>com</groupId>
<artifactId>stock</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>stock</name>
<description>stock</description>
<url/>
<licenses>
<license/>
</licenses>
<developers>
<developer/>
</developers>
<scm>
<connection/>
<developerConnection/>
<tag/>
<url/>
</scm>
<properties>
<java.version>21</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
</dependencies>
</project>
注册nacos显示查看

使用服务名:
- 在需要调用端加入依赖包,在order-server 中加入
bash
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-loadbalancer</artifactId>
</dependency>
- 在resttemplate 上启用标签
@LoadBalanced 注解,使得 RestTemplate
调整后的代码如下:
bash
@Bean
@LoadBalanced
public RestTemplate getRestTemplate(){
return new RestTemplate();
}
- 在调用代码的地方把原来的地址改成服务名
原来的地址:http://loalhost:8081 改成stock-server,代码如下:
bash
@RequestMapping("/add")
public String add(){
// 输出方法调用
System.out.println("下单成功");
String msg= "";
msg = restTemplate.getForObject("http://stock-server/storage/deduct", String.class);
return "Hello World!"+msg;
}
测试输出结果:

封装成类的方式调用
添加依赖--order
bash
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
启动类添加标签--order
@EnableFeignClients
StockFeign接口--order
bash
package com.order.FeignService;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.RequestMapping;
@FeignClient(name="stock-server",path ="/stock")
public interface StockFeignService {
// 声明需要调用的rest接口对应的方法
@RequestMapping("/reduct")
String reduct();
}
调用代码调整--order
- 声明变量
bash
@Autowired
private StockFeignService stockFeignService;
- 代码调用处
bash
msg = stockFeignService.reduct();
System.out.println("msg3: " + msg);
- 程序运行效果
效果图如下:

nacos 配置
包的依赖和配置
- 包的依赖
bash
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
- 配置application.yaml
bash
spring.config:
import:
- optional:nacos:${spring.application.name}.yaml
spring.cloud:
nacos:
serverAddr: 127.0.0.1:8848
- 在nacos 配置列表中添加一个配置,name:order-server.yaml,author:小明
效果图如下:

处理代码
- 声明变量 -- order controller
bash
@Value("${author}")
private String author="";
- 代码
return author+"Hello World!"+msg;
- nacos 在配置更改author 的值后,order-server 需要跟着变化,还需要设置
bash
@RefreshScope
public class OrderController
效果图如下:author 的值为小明

网关gateway
gateway 接收用户的请求,转发到order-server, 然后order-server 调用stock-server
nacos 配置 :gateway.yaml,文件内容如下;
bash
# 还需要注册中心、配置中心
spring:
cloud:
gateway:
#路由规则
routes:
- id: order_route # 路由的唯一标识,路由到order
uri: lb://order-server #需要转发的地址 lb: 使用nacos中的本地负载均衡策略 order-service服务名
#断言规则 用于路由规则的匹配
predicates:
- Path=/order/**
说明id 的值为路由id,uri中使用的order-server 为nacos 中的服务,path 中的/order 为在浏览器中请求的url。
添加gateway module
更改pom.xml 依赖
bash
<?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">
<modelVersion>4.0.0</modelVersion>
<parent>
<!-- <groupId>org.springframework.boot</groupId>-->
<!-- <artifactId>spring-boot-starter-parent</artifactId>-->
<!-- <version>3.5.13.RELEASE</version>-->
<!-- <relativePath/> <!– lookup parent from repository –>-->
<groupId>com</groupId>
<artifactId>sc-springcloudalibaba</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<!-- Generated by https://start.springboot.io -->
<!-- 优质的 spring/boot/data/security/cloud 框架中文文档尽在 => https://springdoc.cn -->
<groupId>com</groupId>
<artifactId>gateway</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>gateway</name>
<description>gateway</description>
<properties>
<java.version>21</java.version>
</properties>
<dependencies>
<!-- gateway -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<!-- nacos config -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<!-- nacos discovery -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!-- 负载均衡 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
更改application.properies 为application.yaml 文件,内容如下:
bash
# 服务端口
server:
port: 8084
#spring程序名
spring:
application:
name: gateway
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
config:
server-addr: 127.0.0.1:8848
config:
import:
- optional:nacos:gateway.yaml
注册服务
bash
package com.gateway;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
// Generated by https://start.springboot.io
// 优质的 spring/boot/data/security/cloud 框架中文文档尽在 => https://springdoc.cn
@SpringBootApplication
@EnableDiscoveryClient
public class GatewayApplication {
public static void main(String[] args) {
SpringApplication.run(GatewayApplication.class, args);
}
}
服务注册检查

url测试:http://localhost:8084/order/add

seata 分布式事物
事物分布式图解:

包依赖
bash
<!--jdbc-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<!--mybatis配置-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>3.0.3</version>
</dependency>
<!--mysql依赖-->
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
</dependency>
<!--druid-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.10</version>
</dependency>
stock-server.yaml 配置文件内容:
bash
spring:
datasource:
username: root
password: 123456
url: jdbc:mysql://localhost:3306/seata_order?
driver-class-name: com.mysql.cj.jdbc.Driver
type: com.alibaba.druid.pool.DruidDataSource
#初始化sql
schema: classpath:sql/schema.sql
initialization-model: never
#设置mybatis
mybatis:
mapper-locations: classpath:com/order/mappper/*Mapper.xml
type-Aliases-Package: com.order.pojo
configuration:
mapUnderscoreToCamelCase: true
Sentinel
依赖包
bash
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
配置
bash
spring:
cloud:
sentinel:
transport:
port: 8719
dashboard: localhost:8081
启动
$ java -Dserver.port=8080 -Dcsp.sentinel.dashboard.server=localhost:8080 -jar sentinel-dashboard.jar
配置:jmeter.properties
- 强制优先使用IPv4协议栈
java.net.preferIPv4Stack=true - 禁止优先解析IPv6地址
java.net.preferIPv6Addresses=false
测试配置限流2,效果图如下:

测试效果图如下:

