1-项目搭建


一、项目搭建

1、注意事项

(1)字符编码

2

(2)注解生效激活

3

(3)java编译版本选8

4

2、父工程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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <packaging>pom</packaging>

    <groupId>com.rewind</groupId>
    <artifactId>rewind-cloud</artifactId>
    <version>1.0-SNAPSHOT</version>

    <!-- 依赖版本号管理 -->
    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
        <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.2.4.RELEASE</spring-boot.version>
        <spring-cloud.version>Hoxton.SR1</spring-cloud.version>
        <spring-cloud-alibaba.version>2.1.0.RELEASE</spring-cloud-alibaba.version>
        <mysql.version>8.0.17</mysql.version>
        <mybatis-plus.version>3.3.1</mybatis-plus.version>
        <lombok.version>1.18.24</lombok.version>
    </properties>

    <!-- 定义子模块 -->
    <modules>
        <module>cloud-gateway-hystrix</module>
        <module>order-service</module>
        <module>stock-service</module>
    </modules>

    <!-- 依赖管理 -->
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>${spring-boot.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>${spring-cloud-alibaba.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <!--spring cloud Hoxton.SR1-->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <version>${mysql.version}</version>
            </dependency>
            <dependency>
                <groupId>com.baomidou</groupId>
                <artifactId>mybatis-plus-boot-starter</artifactId>
                <version>${mybatis-plus.version}</version>
            </dependency>
            <dependency>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
                <version>${lombok.version}</version>
            </dependency>
        </dependencies>
    </dependencyManagement>

</project>

3、子模块通用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">
    <modelVersion>4.0.0</modelVersion>
    <artifactId>stock-service</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>stock-service</name>
    <description>Demo project for Spring Boot</description>

    <!-- 继承父模块 -->
    <parent>
        <artifactId>rewind-cloud</artifactId>
        <groupId>com.rewind</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>

    <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.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.1</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                    <encoding>UTF-8</encoding>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>${spring-boot.version}</version>
                <configuration>
                    <mainClass>com.rewind.order.OrderServiceApplication</mainClass>
                    <!-- 阿里生成的springboot项目需要修改下面配置 -->
                    <!-- <skip>true</skip> -->
                    <!-- 将上面skip标签注释掉或删掉,添加如下includeSystemScope标签 -->
                    <includeSystemScope>true</includeSystemScope>
                </configuration>
                <executions>
                    <execution>
                        <id>repackage</id>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>

    </build>
</project>

二、引入Nacos

1、依赖

<!-- 服务发现 -->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!-- 配置中心 -->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>

2、配置文件

(1)bootstrap.yml

# 应用服务 WEB 访问端口
server:
  port: 8081

spring:
  application:
    name: order-service
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848 #配置Nacos地址
        namespace: 38efc944-744e-45bb-a814-e356fbd883c3 #命名空间,nacos中配置
      config:
        namespace: ${spring.cloud.nacos.discovery.namespace}
        server-addr: ${spring.cloud.nacos.discovery.server-addr}
        file-extension: yml
        group: rewind-cloud

3、启动类

@SpringBootApplication
@EnableDiscoveryClient
public class OrderServiceApplication {
    public static void main(String[] args) {
        SpringApplication.run(OrderServiceApplication.class, args);
    }
}

三、引入OpenFeign

1、依赖

<!--openfeign-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

2、配置

feign:
  hystrix:
    enabled: true

3、启动类

@EnableFeignClients

4、使用

@Component
@FeignClient(value = "stock-service", path = "/stock", fallbackFactory = StockFeignService.StockFeignServiceFallback.class)
public interface StockFeignService {

    @GetMapping("/test1")
    public String test1();

    @Component
    class StockFeignServiceFallback implements FallbackFactory<StockFeignService> {

        @Override
        public StockFeignService create(Throwable throwable) {
            return new StockFeignService() {
                @Override
                public String test1() {
                    return "服务降级:" + throwable.getMessage();
                }
            };
        }
    }
}

四、Hystrix熔断限流

1、依赖

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>

2、启动类

@EnableCircuitBreaker

3、熔断降级使用

@Service
public class OrderServiceImpl extends ServiceImpl<OrderMapper, TOrder> implements OrderService {

    @Autowired
    private StockFeignService stockFeignService;

    @Override
    @HystrixCommand(fallbackMethod = "createOrderFallback",
        commandProperties = {
            @HystrixProperty(name = "circuitBreaker.enabled",value = "true"),// 是否开启断路器
            // 一个统计窗口内(默认10s)请求数量达到此值(默认20)才会进行熔断与否的判断,不是要失败那么多个才熔断
            // 即指定时间内达到该值才会对失败率进行判断,从而判断是否熔断
            @HystrixProperty(name = "circuitBreaker.requestVolumeThreshold",value = "5"),
            // 时间窗口期(短路多久以后开始尝试是否恢复,默认5s)(休眠时间)(单位毫秒)
            @HystrixProperty(name = "circuitBreaker.sleepWindowInMilliseconds",value = "10000"),
            // 失败率(%)达到多少后熔断,出错百分比阈值,当达到此阈值后,开始短路。默认50%)
            @HystrixProperty(name = "circuitBreaker.errorThresholdPercentage",value = "60"),
        }
    )
    public String createOrder() {
        int i = 1/0;
        String s = stockFeignService.test1();
        return s;
    }

    public String createOrderFallback(){
        System.out.println("熔断");
        return "服务熔断降级";
    }
}

五、Sentinel熔断限流

六、gateway网关

1、依赖

<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>

    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <optional>true</optional>
    </dependency>

    <!-- SpringCloud ailibaba nacos -->
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    </dependency>

    <!--gateway-->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-gateway</artifactId>
    </dependency>


</dependencies>

2、配置文件

server:
  port: 9527

spring:
  application:
    name: cloud-gateway-hystrix
  cloud:
    #使用nacos作为注册中心
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848 #配置Nacos地址
        namespace: *********
    gateway:
      discovery:
        locator:
          enabled: true #开启从注册中心动态创建路由的功能,利用微服务名进行路由

      routes:
        - id: order-service #路由的ID,没有固定规则但要求唯一,建议配合服务名
          #uri: http://localhost:8001          #匹配后提供服务的路由地址
          uri: lb://order-service #匹配后提供服务的路由地址(动态路由)
          predicates: # 其他属性本文后面有介绍
            - Path=/order/**         # 断言,路径相匹配的进行路由

        - id: stock-service
          #uri: http://localhost:8001
          uri: lb://stock-service
          predicates:
            - Path=/stock/**         # 断言,路径相匹配的进行路由
            #- After=2020-02-21T15:51:37.485+08:00[Asia/Shanghai]
            #- Cookie=username,zzyy
            #- Header=X-Request-Id, \d+  # 请求头要有X-Request-Id属性并且值为整数的正则表达式

七、Dubbo

1、依赖

<dependency>
    <groupId>org.apache.dubbo</groupId>
    <artifactId>dubbo</artifactId>
    <version>3.3.0</version>
</dependency>

  目录