Spring Cloud Alibaba 项目搭建流程

2023-11-05

在这里插入图片描述

Spring Cloud Alibaba 项目搭建

​​
请添加图片描述

1.项目结构搭建

springcloudalibaba-xmn
pom.xml
gateway-server-1030 //网关
user-common //公共类
order-server-1020 //消费者服务
user-server-1010 //提供者服务

父工程搭建

搭建效果如图

pom.xml

<!--公共的一些配置-->
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>

    </properties>

    <!--SpringBoot-->
    <parent>
        <groupId> org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.5.RELEASE</version>
    </parent>

    <!--SpringCloud-->
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>2.2.1.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Hoxton.SR3</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
        </dependency>
    </dependencies>

user模块的搭建:

在这里插入图片描述

pom.xml

    <dependencies>
        <!--公共类配置-->
        <dependency>
            <groupId>cn.xmn</groupId>
            <artifactId>user-commom</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!-- nacaos 注册发现客户端 -->
        <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>

        <!--  sentinel 客户端 -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
        </dependency>

        <!--Sentinel和Nacos做持久的-->
        <dependency>
            <groupId>com.alibaba.csp</groupId>
            <artifactId>sentinel-datasource-nacos</artifactId>
            <version>1.5.2</version>
        </dependency>
    </dependencies>

user客户端主启动类

package cn.xmn;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

@SpringBootApplication
@EnableDiscoveryClient
public class UserApplication {

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

user的yml配置文件

server:
  port: 10010
spring:
  application:
    name: user-server
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848	#注册中心地址

启动Nacos,观察user是否注册进来

user的cotroller接口实现

package cn.xmn.controller;

import cn.xmn.pojo.User;
import cn.xmn.sentinelhandler.UserBlockHandler;
import cn.xmn.sentinelhandler.UserFallBack;
import com.alibaba.csp.sentinel.annotation.SentinelResource;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.concurrent.ThreadLocalRandom;

@RestController
@RefreshScope //刷新配置
@RequestMapping("/user")
public class UserController {

    @Value("${server.port}")
    private int port ;

    @RequestMapping("/getuser/{id}")
    @SentinelResource(value = "user-getUser",
            blockHandler ="getUserBlockHandler",
            blockHandlerClass = UserBlockHandler.class,
            fallbackClass = UserFallBack.class,
            fallback = "getUserFallBack"
            )
    public User getUser(@PathVariable("id") Long id){
        int i = ThreadLocalRandom.current().nextInt(6);
        System.out.println("i :" + i);
        if (i%3 ==0){
           int j = 1/0;
        }
            return  new User(id,"九块九小码农",28,"java"+port);
    }

}

UserBlockHandler

package cn.xmn.sentinelhandler;

import cn.xmn.pojo.User;
import com.alibaba.csp.sentinel.slots.block.BlockException;

public class UserBlockHandler {
    //必须是静态方法
    public static User getUserBlockHandler(Long id, BlockException e){
        e.printStackTrace();
        return new User(-1L,"限流了",500,"我被限流了");
    }
}

UserFallBack

package cn.xmn.sentinelhandler;

import cn.xmn.pojo.User;
import com.alibaba.csp.sentinel.slots.block.degrade.DegradeException;

public class UserFallBack {

    public static User getUserFallBack(Long id,DegradeException exception){
       exception.printStackTrace();
        return  new User(-1L,"熔断降级",500,"出现异常,我被熔断了");
    }
}

application.yml

#server:
#  port: 10010
#
#spring:
#  application:
#    name: user-server
#
#  cloud:
#    nacos:
#      discovery:
#        server-addr: 127.0.0.1:8848

spring:
  cloud:
    sentinel:   #sentinel仪表盘
      transport:
        dashboard: 127.0.0.1:1111

      datasource:
        flow:
          nacos: #限流持久配置
            server-addr: localhost:8848	#使用nacos的持久
            dataId: user-sentinel	#获取限流的数据源的dataId
            groupId: DEFAULT_GROUP
            rule-type: flow #类型:限流
            namespace: 35bf3e12-6a2d-49f3-885d-517639e5afa5

bootstrap.yml

#server:
#  port: 10020


spring:
  application:
    name: user-server #服务名称

  cloud:
    nacos:
      config:   # 配置中心
        server-addr: 127.0.0.1:8848
        file-extension: yaml
        namespace: 35bf3e12-6a2d-49f3-885d-517639e5afa5  #命名空间
        group: DEFAULT_GROUP
  profiles:
    active: dev

公共模块的搭建:

在这里插入图片描述

user-common的集成:

pom.xml

    <dependencies>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
    </dependencies>

实体类

package cn.xmn.pojo;


import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {

    private Long id;
    private String name;
    private Integer age;
    private String info;

}

gateway模块的搭建:

在这里插入图片描述

pom.xml

    <dependencies>
        <!--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>
        <!--    限流和gataway使用-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-alibaba-sentinel-gateway</artifactId>
        </dependency>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
        </dependency>
    </dependencies>

yml配置

server:
  port: 10030

spring:
  application:
    name: gateway-server

  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848

    sentinel:   #sentinel仪表盘
      transport:
        dashboard: 127.0.0.1:1111

    gateway:
      discovery:
        locator:
          enabled: false #开放服务名访问方式
          lower-case-service-id: true #服务名小写
      routes:
        - id: application-user #指定服务名
          uri: lb://user-server #去注册中心找这个服务名
          predicates: #断言,匹配访问的路径
            - Path=/apis/user/**    #服务访问路径
          filters:
            - StripPrefix=2    #请求转发的时候会去掉 /user访问路径

getway启动类:

package cn.xmn;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

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

SentineConfig类集成

package cn.xmn.config;

import com.alibaba.csp.sentinel.adapter.gateway.sc.callback.BlockRequestHandler;
import com.alibaba.csp.sentinel.adapter.gateway.sc.callback.GatewayCallbackManager;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.reactive.function.server.ServerResponse;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;

@Configuration
public class SentinelConfig {
    public SentinelConfig(){
        GatewayCallbackManager.setBlockHandler(new BlockRequestHandler() {
            @Override
            public Mono<ServerResponse> handleRequest(ServerWebExchange serverWebExchange, Throwable throwable) {
                return ServerResponse.ok().body(Mono.just("限流啦,请求太频繁"),String.class);
            }
        });
    }
}

order模块的搭建:

在这里插入图片描述

pom.xml

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

        <!--nacos 注册中心客户端的包 -->
        <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>

        <!--nacos 配置客户端的包 -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        </dependency>

        <!--sentinel的集成feign的包-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
        </dependency>

application.yml配置

##server:
##  port: 10020
#
#
#spring:
#  application:
#    name: order-server
#
#  cloud:
#    nacos:
#      discovery: # 注册中心的
#        server-addr: 127.0.0.1:8848
#
#      config:   # 配置中心
#        server-addr: 127.0.0.1:8848
#        file-extension: yaml
#  profiles:
#    active: dev

feign:
  sentinel:
    enabled: true #熔断

bootstrap.yml配置:

#server:
#  port: 10020


spring:
  application:
    name: order-server

  cloud:
    nacos:
      discovery: # 注册中心的
        server-addr: 127.0.0.1:8848

      config:   # 配置中心
        server-addr: 127.0.0.1:8848
        file-extension: yaml
  profiles:
    active: dev

主启动类

package cn.xmn;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients;

@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
public class OrderApplication {

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

controller层

package cn.xmn.controller;

import cn.xmn.feignclient.UserFeignClient;

import cn.xmn.pojo.User;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/order")
@Slf4j
@RefreshScope
public class OrderController {

    @Autowired
    private UserFeignClient feignClient;

    @Value("${text.value}")
    private String text;

    @RequestMapping("/getuser/{id}")
    public User getUser(@PathVariable("id") Long id){
        // 调用UserServer的API -- Http
        User user = feignClient.getUser(id);
        log.info("text: "+text);

        return user ;
    }

}

UserFeignClient接口

package cn.xmn.feignclient;

import cn.xmn.feignclient.factory.UserFeignClientFallbackFactory;
import cn.xmn.pojo.User;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;

@FeignClient(value = "user-server",fallbackFactory = UserFeignClientFallbackFactory.class)
public interface UserFeignClient  {

    @RequestMapping("/user/getuser/{id}")
    User getUser(@PathVariable("id") Long id);
}

实现工厂类

package cn.xmn.feignclient.factory;

import cn.xmn.feignclient.UserFeignClient;
import cn.xmn.pojo.User;
import feign.hystrix.FallbackFactory;
import org.springframework.stereotype.Component;

@Component
public class UserFeignClientFallbackFactory implements FallbackFactory<UserFeignClient> {
    @Override
    public UserFeignClient create(Throwable throwable) {
        throwable.printStackTrace();
        return new UserFeignClient() {
            @Override
            public User getUser(Long id) {
                return new User(-1L,"兜底数据+Sentinel",500,"我挂了");
            }
        };
    }
}

2. Nacos管理

在这里插入图片描述

3.Sentinel限流和熔断

在这里插入图片描述
欢迎各位大佬多多指教,每天分享一些学习心得,充实每一天!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Spring Cloud Alibaba 项目搭建流程 的相关文章

随机推荐

  • fread 读文件问题(csdn)

    http topic csdn net t 20030912 21 2254341 html fread 返回的是所有被读取的字节数 假如数目不等于请求的字节数 说明有错误发生或者到达文件结束标志 End of File 下面写了个读取完整
  • 最小二乘法ols 系数 a、b 计算公式

    对于拟合函数 Y a bX 求解 a b 需要先求出b再求a 分子分母同时除n得到 上面的公式就是网上常看到的计算b的公式
  • k型热电偶材料_常见热电偶大集合,说不定对你有用

    温度是工业自动化中的一个重要参数 温度仪表一般分接触式测量仪表与非接触式测量仪表 现代接触式温度仪表又以热电阻和热电偶为主 热电阻和热电偶分类方法很多 不过一般以材质进行分类 今天我们就来看一下常见热电偶种类 热电偶 如下图所示 热电偶是两
  • 如何免费复制百度文库上的文字

    场景 复制百度文库上的文字 一般是收费的 解决方案 按 F12 点击设置 禁用JavaScript 即可复制
  • [leetcode] 432. 全 O(1) 的数据结构

    题目链接 之前没有做过这种类型的题目 看到的时候一脸蒙圈 看了官方题解之后 了解到这个是双向链表 然后来写一下题解 我们可以维护一个链表 这个链表是一个双向的 把这个链表维护成从头节点到尾节点是单调递增的 然后我们就可以很好的通过头尾返回出
  • Ubuntu 16.04下Anaconda的安装及使用

    文章目录 一 Anaconda的下载及安装 1 下载Anaconda 2 安装Anaconda 3 配置清华镜像源 二 Anaconda的基本使用 1 管理conda版本 2 管理虚拟环境 3 安装第三方包 三 Anaconda的卸载及重装
  • 【MySQL数据库的学习】

    MySQL数据库 1 连接数据库 mysql u root p 123456 2 创建数据库 create database 数据库名称 以字母 数字 下划线组成的字符串 但不要以数字开头 3 查看数据库 show databases 4
  • 内网和外网的区别是什么?

    内网和外网的区别重要依据主要是判断它是不是与广阔的外界相连 内网和外网最大的区别 内网IP局域网 网线都是连接在同一个 交换机上面的 也就是说它们的IP地址是由交换机或者路由器进行分配的 而且每一个IP也是有所不同的 并且这些连接在同一个路
  • 解决“error C267 ‘Beep_Led_yellow‘ requires ANSI-style prototype”错误方法

    今天给大家分享一个大家可能经常见的错误提示 error C267 Beep Led yellow requires ANSI style prototype 错误原因 这个错误其实是因为是指你的函数没有形参 却在使用过程中使用了值 就是比如
  • MATLAB中subplot绘图相关技巧

    http xiaotingzi blog 163 com blog static 217769214201361981535727 The first thing I want to mention is that tightfig has
  • 登录和第三方授权

    登录和授权的区别 登录 身份认证权限 授权 身份认证权限 令牌 cookie Autorization Autorization授权的两种方式 Basic Authorization Basic xxxx 风险 Bearer HTTP he
  • souce insight symble window 关闭

    单个文件 打开关闭 symble window 可以右击唤出右键菜单栏 点击symbol window即可 打开操作相同 所有文件打开或者关闭 ALT Y 打开file type option 或者菜单栏点击options打开file ty
  • iframe 父子之间的传值

    1 父给子传值 经过一个点击事件 给子页面传值 显示不同的模型 父页面代码 事件 onclick row column event var iframe document getElementById iframe container va
  • 关于oracle sql developer

    刚刚上班遇到Oracle SQL Developer不是很明白 百度了一下做了整理 方便以后查阅 Oracle SQL Developer是Oracle公司出品的一个免费的集成开发环境 是一个免费非开源的用以开发数据库应用程序的图形化工具
  • 在小程序中使用ES6的新特性

    文章目录 在小程序中使用ES6的新特性 1 模板对象 2 默认参数 3 类 4 解构赋值 5 箭头函数 6 使用promise简化回调 总结 在小程序中使用ES6的新特性 ECMAScript 6 简称ES6 是于2015年6月正式发布的J
  • devDependencies和dependencies的区别

    本文是学习笔记 非原创 非原创 非原创 学习node js的时候 老师就说了要从package json这个文件开始看起 其实一开始也是懵懵懂懂的 不知道啥叫包管理 后来逐渐开始知道了 真的为自己的智商感到捉急 今天主要是记录devDepe
  • 聚焦小游戏技术生态,腾讯游戏云GAME-TECH落地厦门

    欢迎大家前往腾讯云 社区 获取更多腾讯海量技术实践干货哦 本文由腾讯游戏云 发表于云 社区专栏 2018迎来了小游戏元年 据 2018年小游戏行业白皮书 显示 2018年小游戏市场规模预计将达到300亿元 国内小游戏用户将超5亿人 未来或有
  • 187_零线和火线

    火线 英文简写L LIVE 一般为红色或黄色或绿色 零线 英文简写N NEUTRAL 一般为蓝色 零线火线 专指 民用电的供电线路 市电的交流供电电压为220伏特 V 不同的国家不一样 中国是220V 它包括一根零线 N 和一根火线 L 零
  • 钉钉企业内部H5微应用、免登流程与真机调试

    官方文档 https ding doc dingtalk com 项目作为企业内部应用 H5微应用接入 免登 官方免登流程文档 https ding doc dingtalk com doc dev ep7bpq 简单来说 前端通过钉钉提供
  • Spring Cloud Alibaba 项目搭建流程

    Spring Cloud Alibaba 项目搭建 1 项目结构搭建 springcloudalibaba xmn pom xml gateway server 1030 网关 user common 公共类 order server 10