java 微服务学习笔记

java 微服务学习笔记

基础

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

效果图如下:

打开

http://localhost:8848/nacos

创建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/> &lt;!&ndash; lookup parent from repository &ndash;&gt;-->
        <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);
  • 程序运行效果

http://localhost:8083/order/add

效果图如下:

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/> &lt;!&ndash; lookup parent from repository &ndash;&gt;-->
        <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,效果图如下:

测试效果图如下:

相关推荐
zopple1 天前
四大编程语言对比:PHP、Python、Java与易语言
java·python·php
逍遥德1 天前
Java 锁(线程间)和数据库锁(事务间)对比详解
java·数据库·sql·高并发·锁机制
gwjcloud1 天前
Docker详解
java·docker·容器
夜瞬1 天前
NLP学习笔记02:文本表示方法——从词袋模型到 BERT
笔记·学习·自然语言处理
河阿里1 天前
Java-JWT令牌技术深度指南
java·开发语言
xuhaoyu_cpp_java1 天前
MySql学习(二)
经验分享·笔记·学习·mysql
你叶不叶1 天前
sap rap 的技术开发自己的学习路径
学习
WiChP1 天前
【V0.1B6】从零开始的2D游戏引擎开发之路
java·log4j·游戏引擎
厚皮龙1 天前
VAE 与世界模型学习总结
学习
小拉达不是臭老鼠1 天前
Unity05_3D数学
学习·unity·游戏引擎