【微服务-springcloud-alibaba系列服务搭建】

1、安装nacos(windows)

nacos官网:https://nacos.io/zh-cn/index.html
下载zip包,解压到任意磁盘目录下,创建数据库nacos,执行nacos-server-2.1.1\nacos\conf目录下的nacos-mysql.sql,nacos默认为集群,如果是单机,需要修改配置文件

双击startup.cmd启动

启动成功后,访问:http://192.168.52.1:8848/nacos
在这里插入图片描述
在这里插入图片描述

2、新建父工程

1、新建maven项目
2、引入依赖

在这里插入代码片
<dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>


    </dependencies>
    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
        <spring-cloud.version>2021.0.1</spring-cloud.version>
        <spring-cloud-alibaba.version>2021.0.1.0</spring-cloud-alibaba.version>
    </properties>

3、新建子工程订单服务(service-order)

1、配置文件,把工程注册到nacos

在这里插入代码片
spring:
  application:
    name: service-order
  cloud:
    nacos:
      discovery: http://192.168.52.1:8848/


2、添加pom依赖

在这里插入代码片
 <dependencies>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
            <version>${spring-cloud-alibaba.version}</version>
        </dependency>

    </dependencies>

启动项目后,可以在nacos服务列表查看服务
在这里插入图片描述

4、新建子工程-商品服务(service-good)

1、配置文件,把工程注册到nacos

在这里插入代码片
spring:
  application:
    name: service-good
  cloud:
    nacos:
      discovery: http://192.168.52.1:8848/


2、添加pom依赖

在这里插入代码片
 <dependencies>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
            <version>${spring-cloud-alibaba.version}</version>
        </dependency>

    </dependencies>

3、启动项目后,可以在nacos服务列表查看服务
在这里插入图片描述

5、新建网关服务

5.1 路由转发

1、pom文件

在这里插入代码片
  <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.3.2.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.example</groupId>
    <artifactId>service-gateway</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>service-gateway</name>
    <description>service-gateway</description>
    <properties>
        <java.version>1.8</java.version>
        <spring-cloud-alibaba.version>2021.0.1.0</spring-cloud-alibaba.version>
    </properties>
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Hoxton.SR9</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>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
            <version>${spring-cloud-alibaba.version}</version>
        </dependency>

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

2、修改配置文件

在这里插入代码片
server:
  port: 9092

spring:
  application:
    name: service-gateway
  cloud:
    nacos:
      discovery: http://192.168.52.1:8848/
    gateway:
      discovery:
        locator:
          enabled: true  #表明gateway开启服务注册和发现的功能,并且spring cloud gateway自动根据服务发现为每一个服务创建了一个router,这个router将以服务名开头的请求路径转发到对应的服务
          #lower-case-service-id: true  #是将请求路径上的服务名配置为小写(因为服务注册的时候,向注册中心注册时将服务名转成大写的了
      routes:
        -  id: service-order  #自定义id,无意义但不能重复,最好跟服务名保持一致
           uri: http://192.168.52.1:9090  # 注册中心中的服务吗
           predicates:
             - Path=/order/** # 转发该路径
           filters:
             - StripPrefix=1 #必须加上StripPrefix=1,否则访问服务时会带上order
       #经过gateWay网关时,需要在网关统一配置跨域请求,全部通过
      globalcors:
        cors-configurations:
          '[/**]':
            allowed-origins: "*"
            allowed-headers: "*"
            allow-credentials: true
            allowed-methods:
              - GET
              - POST
              - DELETE
              - PUT
              - OPTION


#spring:
#  datasource:
#    url: jdbc:mysql://localhost:3306/shopping
#    username: root
#    password: 123456
#    driver-class-name: com.mysql.jdbc.Driver
#  main:
#    allow-circular-references: true
#  redis:
#    host: 192.168.52.132
#    password: 123456
#    port: 6379
#    database: 0
#mybatis:
#  mapper-locations: classpath:mapper/*.xml
#  type-aliases-package: com.example.demo.entity
#  configuration:
#    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

#rocketmq:
#  #nameservice服务器地址(多个以英文逗号隔开)
#  name-server: 192.168.52.132:9876
#  #生产者配置
#  producer:
#    #组名
#    group: anran-producer-group
#    #目的地(topic:tag)
#    #topic
#    topic: anran-topic
#    #sync tag(同步消息tag)
#    sync-tag: anran-sync-tags
#    #async tag(异步消息tag)
#    async-tag: anran-async-tags
#    #oneway tag(单向消息tag)

测试
1、访问:http://192.168.52.1:9092/order/getUserId
http://192.168.52.1:9092为网关地址,当通过网关时,拦截/order/**,同事路由转发到订单服务http://192.168.52.1:9090/,然后,根据配置规则,去掉order,变成http://192.168.52.1:9090/getUserId(该接口是订单服务的接口)

5.2 网关实现请求参数拦截

1、新建过滤器GlobalFilter

在这里插入代码片
@Component
public class GatewayFilter implements GlobalFilter {
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        String token = exchange.getRequest().getQueryParams().getFirst("token");
        if(StringUtils.isBlank(token)){
            ServerHttpResponse response = exchange.getResponse();
            response.setStatusCode(HttpStatus.BAD_GATEWAY);
            String re = "token is null";
            DataBuffer wrap = response.bufferFactory().wrap(re.getBytes());
            return response.writeWith(Mono.just(wrap));
        }
        return chain.filter(exchange);
    }
}

测试:
不带token
在这里插入图片描述
带token,可以转发到订单服务
在这里插入图片描述

6、sentinel 限流、服务降级、服务熔断

在这里插入图片描述
整体的数据流转如下图,Sentinel客户端启动后注册到控制台,控制台配置相应的流控规则,并保存到Nacos,Sentinel客户端从Nacos读取配置的限流规则,从而根据规则对自身服务进行限流。

在这里插入图片描述
1、下载sentinel-dashboard.jar
2、启动:

在这里插入代码片
java -Dserver.port=9093 -Dsentinel.dashboard.auth.username=sentinel -Dsentinel.dashboard.auth.password=sentinel -Dserver.servlet.session.timeout=7200 -jar sentinel-dashboard.jar

在这里插入图片描述

6.1 sentinel 实现限流

给订单服务 /getUserId 接口做限流
1、使订单服务与sentinel服务端通信,添加订单服务sentinel依赖,修改配置文件

在这里插入代码片
 <dependency>
      <groupId>com.alibaba.cloud</groupId>
      <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
      <version>2.2.5.RELEASE</version>
    </dependency>
在这里插入代码片
spring:
  application:
    name: service-order
  cloud:
    sentinel:
      transport:
        dashboard: http://192.168.52.1:9093
      eager: true

2、使用注解方式设置接口限流

在这里插入代码片
 @SentinelResource(value = "getUserId",blockHandler = "handleException")
    @RequestMapping(value = "/getUserId",method = RequestMethod.GET)
    public String getUserId() throws InterruptedException {

        return "order----------------------";
    }
    // blockHandler 函数,原方法调用被限流/降级/系统保护的时候调用
    public String handleException(BlockException ex) {
        return "当前访问人数过多,请稍后再访问!!!!!!";
    }

3、在sentinel服务端设置限流规则,value = “getUserId” ,资源名为getUserId,阈值为1表示:1秒内只能接受一个请求
在这里插入图片描述
4、测试
在这里插入图片描述

6.2 sentinel实现热点key,如秒杀场景

1、sentinel服务端设置热点key规则,参数索引为0表示:第一个参数设置1秒内只能接口一次请求
在这里插入图片描述
2、注解方式实现

在这里插入代码片
 @SentinelResource(value = "skillGood")
    @RequestMapping(value = "/skillGood",method = RequestMethod.GET)
    public String skillGood(Long userId){
            return "秒杀成功————————————————————";
    }

添加全局异常捕获

在这里插入代码片
@RestControllerAdvice
public class GlobleExceptinHandler {
    @ResponseBody
    @ExceptionHandler(ParamFlowException.class)
    public String ParamFlowException(){
        return "访问次数频繁,请稍后重试----------";
    }
}

测试
在这里插入图片描述

7、skywalking 监控平台

7.1 监控接口访问情况

1、官网下载开源包,https://skywalking.apache.org/downloads/,https://archive.apache.org/dist/skywalking/
进入目录apache-skywalking-apm-8.5.0\apache-skywalking-apm-bin\bin,windows启动startup.bat

2、到浏览器访问:http://localhost:9094/,默认为8080端口,可以在目录apache-skywalking-apm-8.5.0\apache-skywalking-apm-bin\webapp 修改端口

3、订单服务集成skywalking
1)idea方式集成,在Configurations下添加vm-option

在这里插入代码片
-javaagent:E:\workspace\springcloud-ali2\apache-skywalking-apm-8.5.0\apache-skywalking-apm-bin\agent\skywalking-agent.jar
-DSW_AGENT_NAME=service-order
-DSW_AGENT_COLLECTOR_BACKEND_SERVICES=127.0.0.1:11800

在这里插入图片描述

4、测试,启动订单服务,访问:http://192.168.52.1:9090/getUserId,此时可以在skywalking监控平台看到该接口的监控信息,可以发现接口请求耗时157ms

在这里插入图片描述

7.2 自定义接口链路跟踪

1、在订单服务,添加依赖

在这里插入代码片
 <dependency>
      <groupId>org.apache.skywalking</groupId>
      <artifactId>apm-toolkit-trace</artifactId>
      <version>8.5.0</version>
    </dependency>

在业务方法加注解 @Trace
@Tags(@Tag(key = “getUserById”,value = “arg[0]”)),arg[0]表示第一个参数

在这里插入代码片
 @Trace
    @Tags(@Tag(key = "getUserById",value = "arg[0]"))
    public String getUserById(Long userId){
        geta();
        return "123";
    }
    private void geta(){
        int i = 4/0;
        System.out.println(6);
    }

测试:
在这里插入图片描述
在这里插入图片描述

7.3 设置告警规则

进入目录:\apache-skywalking-apm-8.5.0\apache-skywalking-apm-bin\config,修改alarm-settings.yml文件
在这里插入图片描述

8 openFeign,服务调用

1、订单服务调用商品服务

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值