芝法酱躺平攻略(14)——Nginx与Spring-Cloud-Gateway

这篇具有很好参考价值的文章主要介绍了芝法酱躺平攻略(14)——Nginx与Spring-Cloud-Gateway。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、前言

上一章芝法酱躺平攻略(12)展望了微服务下常见的技术需求与常见解决方案,本期来讲解第一部分,Nginx与SpringCloud-Gateway。
本章将实践在nginx和spring-cloud-gateway的简单使用。

二、nginx的安装与简单使用

2.1 nginx的安装

首先,去官网查找最新稳定版,把下载的nginx包放到DOWNLOAD文件夹下。
而后把该包解压到SOFTWARE文件夹下

mkdir ~/SOFTWARE/nginx
tar -xzvf nginx-1.22.1.tar.gz -C ~/SOFTWARE/nginx

而后安装编译所需的依赖

sudo apt-get install gcc
sudo apt-get install libpcre3 libpcre3-dev
sudo apt-get install zlib1g zlib1g-dev
sudo apt-get install openssl 
sudo apt-get install libssl-dev

而后运行编译安装

sudo ./configure --prefix="/home/hataksumo/SOFTWARE/nginx/bin"
sudo make
sudo make install

安装后,目录结构是这样的:
nginx配置springcloud,nginx,srping-cloud-gateway,reactor,nginx,spring cloud,gateway
conf 是存放配置文件的地方
logs是存放log的地方
sbin是存放nginx运行程序的地方
进入conf,打开nginx.conf,做合适的配置,而后进入sbin,运行nginx。
从浏览器打开localhost:配置监听的ip,就可以看到nginx的页面
nginx配置springcloud,nginx,srping-cloud-gateway,reactor,nginx,spring cloud,gateway

2.2 nginx常用的命令

sudo ./nginx  #运行nginx
sudo ./nginx -s reload #重新加载nginx的配置
sudo ./nginx -s stop #关闭nginx

更多的命令可以在官网上查看

2.3 nginx的反向代理配置

我们先看一个简单的配置,实现简单的负载均衡

	upstream test{
        server 172.25.0.1:8001  weight=3;
        server 172.25.0.1:8002  weight=2;
        server 172.25.0.1:8003  weight=1;
    }

    server {
        listen       80;
        server_name  localhost;

        location /test{
            proxy_pass http://test/api;
        }
	}
}

其中upstream 表示一个负载均衡,可以配置不同服务的权重
server 段表示配置一个服务器,既可以配置http,也可以配置https。

java端口,按芝法酱躺平攻略(13)那样配置打包程序,并添加如下controller测试代码:

@Api(tags = "test-测试接口")
@RequestMapping("/api/test")
@Slf4j
@ZfRestController
@RequiredArgsConstructor
public class TestApi {

    private final AppProperty mAppProperty;

    @GetMapping("/hello")
    public String sayHello(){
        return mAppProperty.getMyName();
    }

}

从浏览器访问http://localhost/test/test/hello,反复刷新,查看现象
nginx配置springcloud,nginx,srping-cloud-gateway,reactor,nginx,spring cloud,gateway

2.4 nginx的静态资源配置

location /img {
    root /home/hataksumo/res;

    proxy_store on;
    access_log /home/hataksumo/res/img/log;
    proxy_temp_path /home/hataksumo/res/img/cache;
    proxy_redirect          off;

    gzip on;
    gzip_comp_level 9;
} 

三、spring-cloud-gateway的简单使用

3.1 网关简介

网关的英文是router,直译过来就是路由。网关的主要职责就是根据请求,做一些处理后转发到其他服务器,当其他服务器信息处理好后,再把处理好的信息返回给客户端。
其他服务器处理信息是需要时间的,网关服务器不应当在这个时间中忙等,所以需要一个不同的架构。在Java中是基于netty的nio模式。
spring-cloud-gateway使用拦截器来处理从前端发给后端得信息,也可以处理从第三方服务返回的信息。

3.2 响应式编程

小编私以为,gateway这块实在没那么多好讲的,核心的知识点反倒是响应式编程。
SpringBoot 提供了Mono机制做响应式编程,当一个请求过来后,并不是开启一个新线程,而是由几个固定线程依次处理过来的请求。当该请求需要请求第三方服务时,将会被跳过处理其他请求。当第三方消息返回后,再加入处理队列依次处理。
在gateway中的controller写法和普通服务基本一致,只是需要返回一个Mono对象,做异步处理。

3.2.1 从helloworld开始

先上代码:

@RequestMapping("/api/test")
@ZfRestController
public class HelloController {

    @GetMapping("hello")
    Mono<RestResponse<String>> hello(){
        RestResponse<String> r = RestResponse.ok("hello");
        return Mono.just(r);
    }
}

Mono.just是一种阻塞的模式,直接返回数据。

3.2.2 我们来异步一下

    @GetMapping("/fibonacii/{n}")
    Mono<RestResponse<BigInteger>> fibonacii(@PathVariable(name = "n") int n){
        CompletableFuture<RestResponse<BigInteger>> future = CompletableFuture.supplyAsync(()->{
            log.info("计算"+n+" 当前线程 "+Thread.currentThread().getId());
            BigInteger res =  getFibonacii(n);
            log.info("计算"+n+" 当前线程 "+Thread.currentThread().getId()+"已完成===========================");
            return res;}).thenApply(v->RestResponse.ok(v));
        log.info("^_^返回"+n+" 当前线程 "+Thread.currentThread().getId());
        return Mono.fromFuture(future);
    }

为了方便测试,我们把netty的worker线程调到2

@SpringBootApplication(
        scanBasePackages = {"indi.zhifa.recipe.bailan.framework","indi.zhifa.recipe.bailan5.gateway"}
)
public class GatewayApplication {
    public static void main(String[] args){
        System.setProperty("reactor.netty.ioWorkerCount","2");
        ApplicationContext context = SpringApplication.run(GatewayApplication.class, args);
    }
}

浏览器请求,http://localhost:9000/api/test/fibonacii/521003,不断刷新,查看控制台,可以观察到以下现象:
nginx配置springcloud,nginx,srping-cloud-gateway,reactor,nginx,spring cloud,gateway
返回线程总是129和101。当然,我们的例子是开了个新线程跑斐波那契数列,如果是从第三方服务拉去数据,或者调用复杂的数据库查询,毫无疑问这就能省去大量的等待时间。

3.2.3 关于db的操作

在异步模式下,目前不是很推荐操作mysql数据库,mongodb倒很推荐。
可以引入下列库做响应式

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-mongodb-reactive</artifactId>
</dependency>

3.3 网关简单负载均衡测试

其实这部分非常简单,没有太多好说的。
日常开发可以直接接入nacos,把微服务全开放了。其实体量有限的线上项目也可以这么干。
如果是个百人的大项目,可以开发一个动态路由,其实也不难写。

这里给出网关的简单配置:

server:
  # 服务端口
  port: 9000
spring:
  application:
    name: "bailan5-gateway"
  servlet:
    multipart:
      enabled : true
      max-file-size: "256MB"
      max-request-size: "256MB"
  cloud:
    nacos:
      server-addr: localhost:8848
      config:
        namespace: tmpTest
        name: gateway
        file-extension: yml
        group: bailan5
      discovery:
        namespace: tmpTest
        register-enabled: true
    gateway:
      discovery:
        locator:
          enabled: true

启动之前的test服务,通过访问localhost:9000/test/api/test/hello即可访问test服务的对应接口

3.3 网关的拦截器配置

官方默认提供了大量默认的拦截器,可以通过yml配置。
这里仅仅讲解自定义的拦截器。下面用接口执行时间为例做代码展示。文章来源地址https://www.toymoban.com/news/detail-732615.html

@Slf4j
@Component
public class CustomFilter implements GlobalFilter, Ordered {

    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        // 前置处理,直接写就行
        String info = String.format("Method:{%s} Host:{%s} Path:{%s} Query:{%s}",
                exchange.getRequest().getMethod().name(),
                exchange.getRequest().getURI().getHost(),
                exchange.getRequest().getURI().getPath(),
                exchange.getRequest().getQueryParams());
        log.info(info);
        exchange.getAttributes().put("startTime", System.currentTimeMillis());
        // 后置处理,放到then
        return chain.filter(exchange).then( Mono.fromRunnable(() -> {
            Long startTime = exchange.getAttribute("startTime");
            if (startTime != null) {
                Long executeTime = (System.currentTimeMillis() - startTime);
                log.info(exchange.getRequest().getURI().getRawPath() + " : " + executeTime + "ms");
            }
        }));
    }
    @Override
    public int getOrder() {
        return Ordered.LOWEST_PRECEDENCE;
    }
}

到了这里,关于芝法酱躺平攻略(14)——Nginx与Spring-Cloud-Gateway的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 使用Docker容器部署java运行环境(java8 + mysql5.7 + redis5.0 + nginx1.14.1

    环境:阿里云ECS服务器 1.1 安装工具 1.2 为yum源添加docker仓库位置 1.3 将软件包信息提前在本地索引缓存 (非必要,建议执行,可以提升yum安装的速度,报错去掉fast试试) 1.4 安装Docker 傻瓜式安装 点击y 1.5 启动Docker 1.6 设置开机自启动 1.7 安装完成后可以测试一下,是否安装成功

    2024年02月02日
    浏览(65)
  • 免签支付●微信支付宝个人收款方案●免签约,免营业执照,稳定安全,私有化部署,0手续,微信支付,支付宝支付,vmq二开,springboot,java,躺平在线要饭...

    预览:在线预览 ,视频演示,截图一览 教程:视频教程 加V获取源码 :微信号:ainowv (微信名:ainow) keywords(全): 免签约,免营业执照,稳定安全,私有化部署,0手续,微信支付,支付宝支付,vmqbeggar二开,springboot,java,躺平在线要饭... 免签支付实现个人微信支付宝二维

    2024年02月03日
    浏览(27)
  • webgis后端安卓系统部署攻略,超详细Termux攻略

    目录 前言 一、将后端项目编译ARM64 二、安卓手机安装termux 1.更换为国内源 2.安装ssh远程访问 3.安装文件远程访问 三、安装postgis数据库 1.安装数据库 2.数据库配置 3.数据导入 四、后端项目部署 五、自启动设置 总结         因为之前一直做的H5+APP开发,GIS服务后端基本上

    2024年02月21日
    浏览(25)
  • MAC QT开发攻略

    由于clion需要使用cmake构建 Ninja Ninja下载 Clion 2023.1.3 破解版安装教程,亲测有效! 更改CMake生成器 CMake Build Configuration 添加运行参数: CMakeCache.txt:CMake会在这个文件中进行缓存,与生成器无关; CMakeFiles:包含由CMake在配置期间生成的临时文件; cmake_install.cmake:CMake脚本处理

    2024年02月11日
    浏览(29)
  • HackTheGame游戏全攻略

    游戏链接 链接: 百度网盘 请输入提取码 提取码:bu1w HackTheGame游戏的玩法: 您将扮演一个黑客的角色,接受各种各样的任务,在不被发现的情况下,使用一些工具入侵他人的电脑,服务器并完成窃取资料,粉碎文件,植入病毒等操作.您有一共有两次机会,第三次被追踪到的话,您就会被捕

    2024年02月05日
    浏览(56)
  • selenium 元素定位攻略大全

    元素名称 描述 Webdriver API id id属性 driver.find_element(By.ID, \\\"id属性值\\\") name name属性 driver.find_element(By.NAME, \\\"name属性值\\\") class_name class属性 driver.find_element(By.CLASS_NAME, \\\"class_name属性值\\\") tag_name 标签名 driver.find_element(By.TAG_NAME, \\\"标签名\\\") link_text a元素的文本内容-精准匹配 driver.find_elemen

    2024年04月12日
    浏览(39)
  • 桂林阳朔旅游攻略

    桂林上水甲天下,阳朔上水甲桂林!阳朔县城看着有点破,但是阳朔的山水真是一绝,适合慢下来,骑个电瓶车来放松心情! 适合游玩时间3天左右。 主要景点:十里画廊、兴坪古镇、如易峰、相公山、20元人民币打卡处、遇龙河漂流、遇龙河骑行。 如果是从桂林去阳朔,可以

    2024年02月06日
    浏览(23)
  • 校园跑腿小程序运营攻略

    作为一名校园跑腿小程序的运营者,你可能会面临诸如用户获取、平台推广、服务质量保证等挑战。在本篇推文中,我将为你提供一些关键的运营策略,帮助你成功运营校园跑腿小程序。 1. 用户获取和留存 用户是校园跑腿小程序成功的关键。以下是一些方法可以帮助你获取

    2024年02月14日
    浏览(28)
  • ChatGPT调用API攻略

           随着ChatGPT的问世,交互型人工智能技术得到了进一步的发展,各大互联网巨头也争相研发类似于ChatGPT的产品,例如百度的文心一言,CSDN的chitgpt等等。相比较而言,ChatGPT的相较于其他而言还是略胜一筹,在这里我们就不过多叙述各个工具的优缺点,我们针对ChatGPT的

    2024年02月11日
    浏览(33)
  • word使用攻略

    1、Ctrl+H打开替换界面,选项哪儿选择使用通配符,然后,查找内容输入  [([0-9]{1,2})] 2、光标在替换为哪儿,按CTRL+shift+= 3、全部替换 为了避免导出为pdf的时候上标又变成正常大小,所以文章定稿时需要做如下处理 4、ctrl+a全选,然后CTRL+shift+F9 解除域链接 5、另存为pdf 转载

    2024年02月22日
    浏览(13)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包