0
点赞
收藏
分享

微信扫一扫

springcloud-study

流计算Alink 2022-03-11 阅读 194

1 使用Nacos作为注册中心和配置中心

1.1 注册中心

1.1.1 下载nacos并以standalone模式启动

  1. 下载

下载地址

  1. 进入到bin目录,启动nacos
startup.cmd -m standalone
  1. 访问

http://127.0.0.1:8848/nacos

用户名:nacos 密码:nacos

1.1.2 建立项目

  1. 建立mavne父工程

image-20220304212010541

  1. 建立两个子工程

image-20220304212202981

1.1.3 服务提供者

  1. pom依赖
<dependency>
   <groupId>com.alibaba.cloud</groupId>
   <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
  1. controller接口
@EnableDiscoveryClient
@RestController
@SpringBootApplication
public class ProviderApplication {

    public static void main(String[] args) {
        SpringApplication.run(ProviderApplication.class, args);
    }


    @Value("${server.port}")
    public String port;

    @GetMapping("/hello")
    public String hi(@RequestParam(value = "name", defaultValue = "world",required = false) String name) {
        return "hello " + name + ", my port is : " + port;
    }
}
  1. application.yml配置文件
server:
  port: 9999
spring:
  application:
    name: nacos-provider
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848

1.1.4 服务消费者

  1. pom文件
<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-openfeign</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-loadbalancer</artifactId>
        </dependency>
  1. 服务调用接口
@FeignClient(value = "nacos-provider")   // 服务提供者服务名
public interface ProviderClient {

    @GetMapping(value = "/hello")
    String hello(@RequestParam(value = "name",defaultValue = "world",required = false)String name);
}
  1. controller接口
@RestController
public class HelloController {

    @Autowired
    private ProviderClient client;

    @GetMapping(value = "/hi-feign/{name}")
    public String hiFeign(@PathVariable(value = "name")String name) {
        return client.hello(name);
    }
}
  1. yml配置
server:
  port: 10001

spring:
  application:
    name: nacos-consumer

  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
  1. 注解
@EnableDiscoveryClient   // 让注册中心能够发现,扫描到该服务
@EnableFeignClients   // 声明该项目是Feign客户端
@SpringBootApplication
public class ConsumerApplication {
    public static void main(String[] args) {
        SpringApplication.run(ConsumerApplication.class, args);
    }
}

1.1.5 多个服务提供者并行运行

image-20220304213858250

image-20220304213912765

1.1.6 查看效果

image-20220304213953046

image-20220304214032671

image-20220304214044717

image-20220304214054791

1.2 配置中心

1.2.1 添加依赖

<dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-bootstrap</artifactId>
        </dependency>

<!--说明:spring-cloud-dependencies 2020.0.0 版本不在默认加载bootstrap 文件,如果需要加载bootstrap 文件需要手动添加依赖-->
<!--https://blog.csdn.net/wyz0923/article/details/118303072-->

1.2.2 bootstrap.yml配置文件

spring:
  application:
    name: nacos-provider


  cloud:
    nacos:
      config:
        server-addr: 127.0.0.1:8848   # nacos服务地址
        file-extension: yaml    # nacos配置扩展名,后缀  (目前仅支持ymal和properties)
        prefix: nacos-provider   # nacos 配置文件前缀

  profiles:
    active: dev
${prefix}-${spring.profile.active}.${file-extension}
# 	加载顺序:bootstrap.yml > application.yml

1.2.3 在nacos中创建配置文件

image-20220305142644612

1.2 4 编写Controller

@RestController
@RefreshScope     // 实现配置热加载
public class ConfigController {

    @Value("${username}")
    private String username;

    @GetMapping("/username")
    public String getUsername() {
        return username;
    }
}

2 使用Gateway作为网关

image-20220305154914731

2.1 导入依赖

<dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-gateway</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-webflux</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-loadbalancer</artifactId>
        </dependency>

2.2 yml配置文件

server:
  port: 10001

spring:
  application:
    name: cloud-gateway
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
    gateway:
      discovery:
        locator:
          enabled: false
          lowerCaseServiceId: true
      routes:
        - id: provider
          uri: lb://nacos-provider
          predicates:
            - Path=/nacos-provider/**
          filters:
            - StripPrefix=1
        - id: consumer
          uri: lb://nacos-consumer
          predicates:
            - Path=/nacos-consumer/**
          filters:
            - StripPrefix=1

2.3 查看

image-20220305150226533

image-20220305150243248

3 sentinel作为熔断器

  • 丰富的应用场景
  • 完备的实时监控
  • 广泛的开源生态
  • 完善的SPI扩展点

3.1 Sentinel dashboard

  1. 下载

  2. 启动

java -Dserver.port=8748 -Dcsp.sentinel.dashboard.server=localhost:8748 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard-1.8.1.jar

image-20220305152748442

  1. 访问

地址 sentinel/sentinel

3.2 修改服务消费者

  1. pom文件
<dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
        </dependency>
  1. 修改配置文件
server:
  port: 20001

spring:
  application:
    name: nacos-consumer

  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848   # nacos服务地址

    sentinel:
      transport:
        port: 18763  # 指定应用与控制台交互的端口,应用本地会起一个该端口占用HttpServer
        dashboard: 127.0.0.1:8748   # sentinel的dashboard地址

feign:
  sentinel:
    enabled: true  # 开启fengn的sentinel自动适配
  1. 访问接口,查看sentinel dashboard

接口

image-20220305153638772

  1. 接口增加qps

image-20220305153846638

image-20220305153909040

快速访问会出现以上结果

3.3 gateway使用Sentinel

  1. 添加依赖
<!--Spring cloud gateway已经适配了sentinel-->
<dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
        </dependency>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-alibaba-sentinel-gateway</artifactId>
        </dependency>
  1. 修改配置文件
server:
  port: 10001

spring:
  cloud:
    gateway:
      discovery:
        locator:
          enabled: false
          lowerCaseServiceId: true
      routes:
        - id: provider
          uri: lb://nacos-provider
          predicates:
            - Path=/nacos-provider/**
          filters:
            - StripPrefix=1
        - id: consumer
          uri: lb://nacos-consumer
          predicates:
            - Path=/nacos-consumer/**
          filters:
            - StripPrefix=1
    sentinel:
      transport:
        port: 18798
        dashboard: 127.0.0.1:8748

  1. 创建网关分组限流规则

参考

package com.example.gateway.config;

import com.alibaba.csp.sentinel.adapter.gateway.common.api.ApiDefinition;
import com.alibaba.csp.sentinel.adapter.gateway.common.api.ApiPredicateItem;
import com.alibaba.csp.sentinel.adapter.gateway.common.api.GatewayApiDefinitionManager;
import com.alibaba.csp.sentinel.adapter.gateway.common.rule.GatewayFlowRule;
import com.alibaba.csp.sentinel.adapter.gateway.common.rule.GatewayRuleManager;
import com.alibaba.csp.sentinel.adapter.gateway.sc.SentinelGatewayFilter;
import com.alibaba.csp.sentinel.adapter.gateway.sc.exception.SentinelGatewayBlockExceptionHandler;
import org.springframework.beans.factory.ObjectProvider;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
import org.springframework.core.annotation.Order;
import org.springframework.http.codec.ServerCodecConfigurer;
import org.springframework.web.reactive.result.view.ViewResolver;

import javax.annotation.PostConstruct;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

@Configuration
public class GatewayConfiguration {

    private final List<ViewResolver> viewResolvers;
    private final ServerCodecConfigurer serverCodecConfigurer;

    public GatewayConfiguration(ObjectProvider<List<ViewResolver>> viewResolversProvider,
                                ServerCodecConfigurer serverCodecConfigurer) {
        this.viewResolvers = viewResolversProvider.getIfAvailable(Collections::emptyList);
        this.serverCodecConfigurer = serverCodecConfigurer;
    }

    /**
     * 配置限流的异常处理
     * @return
     */
    @Bean
    @Order(Ordered.HIGHEST_PRECEDENCE)
    public SentinelGatewayBlockExceptionHandler sentinelGatewayBlockExceptionHandler() {
        // Register the block exception handler for Spring Cloud Gateway.
        return new SentinelGatewayBlockExceptionHandler(viewResolvers, serverCodecConfigurer);
    }

    /**
     * 配置初始化的限流参数
     */
    public void initGatewayRules() {
        Set<GatewayFlowRule> rules = new HashSet<>();
        rules.add(new GatewayFlowRule("nacos-consumer")
            .setCount(1).setIntervalSec(1));
        rules.add(new GatewayFlowRule("nacos-provider")
            .setCount(1).setIntervalSec(1));
        GatewayRuleManager.loadRules(rules);
    }

    /**
     * 初始化限流过滤器
     * @return
     */
    @Bean
    @Order(-1)
    public GlobalFilter gatewayFilter() {
        return new SentinelGatewayFilter();
    }

    @PostConstruct
    public void doInit() {
        initCustomizedApis();
        initGatewayRules();
    }

    /**
     * 自定义API分组
     */
    private void initCustomizedApis() {
        Set<ApiDefinition> definitions = new HashSet<>();
        ApiDefinition api1 = new ApiDefinition("nacos-consumer")
                .setPredicateItems(new HashSet<ApiPredicateItem>() );
        ApiDefinition api2 = new ApiDefinition("nacos-provider")
                .setPredicateItems(new HashSet<ApiPredicateItem>() );
        definitions.add(api1);
        definitions.add(api2);
        GatewayApiDefinitionManager.loadApiDefinitions(definitions);
    }

}
  1. 增加qps

image-20220305160543238

4 Sleuth+Zipkin实现链路追踪

4.1 Zipkin

  1. 下载

地址

  1. 启动
java -jar zipkin-server-2.23.16-exec.jar
  1. 访问

http://localhost:9411

image-20220305171805445

4.2 修改项目

  1. 添加依赖

每个工程的pom文件中加入依赖

<dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-sleuth</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-sleuth-zipkin</artifactId>
        </dependency>
  1. 修改配置文件

在配置文件中添加如下内容:

spring:
  sleuth:
    sampler:
      probability: 1  # 采样率   probability低版本参数   高版本为 rate
  zipkin:
    sender:
      type: web
    service:
      name: nacos-provider
    base-url: http://127.0.0.1:9411/
  1. 测试

image-20220305173233988

image-20220305173248623

5 Spring Boot Admin

5.1 建立admin-server项目

  1. 添加依赖
<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>de.codecentric</groupId>
            <artifactId>spring-boot-admin-starter-server</artifactId>
            <version>2.6.2</version>
        </dependency>
  1. 启动类上添加注解
@EnableAdminServer   // 开启AdminServer功能
  1. 编写配置文件
server:
  port: 30001
spring:
  application:
    name: admin-server

5.2 建立admin-client项目

在之前的基础上稍作修改

  1. 依赖
<dependency>
            <groupId>de.codecentric</groupId>
            <artifactId>spring-boot-admin-starter-client</artifactId>
            <version>2.6.2</version>
        </dependency>
<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
  1. 修改配置文件
spring:
  boot:
    admin:
      client:
        url: http://127.0.0.1:30001

management:
  endpoints:
    web:
      exposure:
        include: '*'
  endpoint:
    health:
      show-details: always
  1. 启动查看效果

image-20220305214852597

点击应用墙可以查看具体信息

5 附录

5.1 springcloud版本管理

  • 版本对照
Finchey2.0.x2.0.x
Release TrainBoot VersionSpring Cloud alibaba version
2020.0.x2.4.x2021.1
Hoxton2.2.x,2.3.x2.2.x
Greenwich2.1.x2.1.x
Edgware1.5.x1.5.x
Dalston1.5.x1.5.x
  • 本文使用springcloud和springcloud-alibaba版本
<!--spring boot-->

<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.4.4</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

<dependencyManagement>
        <dependencies>
            <!--spring cloud dependencies-->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>2020.0.3</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <!--spring cloud alibaba dependencies-->
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>2021.1</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
  • 父级pom文件
<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.4.4</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <groupId>org.example</groupId>
    <artifactId>learn1</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>
    </properties>

    <packaging>pom</packaging>

    <modules>
        <module>provider</module>
        <module>consumer</module>
    </modules>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>2020.0.3</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>2021.1</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </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>
                <configuration>
                    <excludes>
                        <exclude>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                        </exclude>
                    </excludes>
                </configuration>
            </plugin>
        </plugins>
    </build>
    </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>
            <configuration>
                <excludes>
                    <exclude>
                        <groupId>org.projectlombok</groupId>
                        <artifactId>lombok</artifactId>
                    </exclude>
                </excludes>
            </configuration>
        </plugin>
    </plugins>
</build>
举报

相关推荐

zookeeper Study

DVFS study

Matlab_Study

网络编程_Study

0 条评论