Nacos + Gateway网关搭建微服务

1、Docker 部署 Nacos

数据库准备

新建 “nacos_config” 数据库

在https://github.com/alibaba/nacos/blob/develop/distribution/conf/nacos-mysql.sql 获取最新的SQL脚本并执行(注意版本一定要对应),执行成功后如下图所示:

Nacos + Gateway网关搭建微服务

2、安装Nacos

a.下载镜像

docker pull nacos/nacos-server

b.新建 application.properties文件(注意鉴权那个一定要加-不然会出现权限绕过漏洞 CVE-2021-29441)前几天的护网行动可把人忙坏了!

### 开启鉴权
nacos.core.auth.enabled=true
### 关闭使用user-agent判断服务端请求并放行鉴权的功能
nacos.core.auth.enable.userAgentAuthWhite=false
### 配置自定义身份识别的key(不可为空)和value(不可为空)
nacos.core.auth.server.identity.key=my-nacos
nacos.core.auth.server.identity.value=my-nacos

server.contextPath=/nacos
server.servlet.contextPath=/nacos
server.port=8848

spring.datasource.platform=mysql
db.num=1
## 修改为自己的数据库连接和密码
db.url.0=jdbc:mysql://xxxxxxxxxxx.mysql.rds.aliyuncs.com:3306/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
db.user=xxxxxxx
db.password=xxxxxxx

nacos.cmdb.dumpTaskInterval=3600
nacos.cmdb.eventTaskInterval=10
nacos.cmdb.labelTaskInterval=300
nacos.cmdb.loadDataAtStart=false
management.metrics.export.elastic.enabled=false
management.metrics.export.influx.enabled=false
server.tomcat.accesslog.enabled=true
server.tomcat.accesslog.pattern=%h %l %u %t "%r" %s %b %D %{User-Agent}i
nacos.security.ignore.urls=/,/**/*.css,/**/*.js,/**/*.html,/**/*.map,/**/*.svg,/**/*.png,/**/*.ico,/console-fe/public/**,/v1/auth/login,/v1/console/health/**,/v1/cs/**,/v1/ns/**,/v1/cmdb/**,/actuator/**,/v1/console/server/**
nacos.naming.distro.taskDispatchThreadCount=1
nacos.naming.distro.taskDispatchPeriod=200
nacos.naming.distro.batchSyncKeyCount=1000
nacos.naming.distro.initDataRatio=0.9
nacos.naming.distro.syncRetryDelay=5000
nacos.naming.data.warmup=true
nacos.naming.expireInstance=true

c.直接启动

docker  run --name nacos-server -p 8848:8848 --privileged=true --restart=always -e MODE=standalone -e PREFER_HOST_MODE=hostname -v /root/nacos/logs:/home/nacos/logs -v /root/application.properties:/home/nacos/conf/application.properties -d nacos/nacos-server

d.测试,注意打开8848安全组

浏览器输入: IP:8848/nacos 默认账号密码: nacos nacos

Nacos + Gateway网关搭建微服务

3、Nginx 代理 接口域名(没有域名的可以跳过)

域名有ssl证书的修改nginx.conf文件,网关我们使用8000端口,现在一次配好

HTTPS server
    server {
        listen       443 ssl;
        server_name  api.zhouhong.icu;

        charset utf-8;
        ssl_certificate   /usr/local/nginx/ssl/8247790_api.zhouhong.icu.pem;
        ssl_certificate_key /usr/local/nginx/ssl/8247790_api.zhouhong.icu.key;
        ssl_session_timeout 5m;
        ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
        ssl_prefer_server_ciphers on;
        ## Nacos
        location /nacos {
             proxy_pass   http://127.0.0.1:8848;
        }
        ## 网关
        location / {
                 proxy_pass   http://127.0.0.1:8000;
        }
    }

没有ssl安全证书的可以如下配置,网关我们使用8000端口,现在一次配好

    server {
        listen       80;
        server_name  api.zhouhong.icu;

        ## Nacos
        location /nacos {
             proxy_pass   http://127.0.0.1:8848;
        }
        ## 网关
        location / {
             proxy_pass   http://127.0.0.1:8000;
        }
    }

测试

Nacos + Gateway网关搭建微服务

1.pom文件(只展示部分,详细信息请到github看代码~)

        <dependency>
            <groupid>com.alibaba.cloud</groupid>
            <artifactid>spring-cloud-starter-alibaba-sentinel</artifactid>
            <exclusions>
                <exclusion>
                    <artifactid>fastjson</artifactid>
                    <groupid>com.alibaba</groupid>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupid>com.alibaba.cloud</groupid>
            <artifactid>spring-cloud-starter-alibaba-nacos-config</artifactid>
            <exclusions>
                <exclusion>
                    <artifactid>fastjson</artifactid>
                    <groupid>com.alibaba</groupid>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupid>com.alibaba.cloud</groupid>
            <artifactid>spring-cloud-starter-alibaba-nacos-discovery</artifactid>
            <exclusions>
                <exclusion>
                    <groupid>org.springframework.cloud</groupid>
                    <artifactid>spring-cloud-starter-netflix-ribbon</artifactid>
                </exclusion>
            </exclusions>
        </dependency>

2.配置文件 application.yml

#&#x8BF7;&#x6C42;&#x548C;&#x54CD;&#x5E94;GZIP&#x538B;&#x7F29;&#x652F;&#x6301;
feign:
  httpclient:
    enabled: false
  okhttp:
    enabled: true
  compression:
    request:
      enabled: true
      mime-types: text/xml,application/xml,application/json
      min-request-size: 2048
    response:
      enabled: true

spring:
  cloud:
    gateway:
      enabled: true
      discovery:
        locator:
          lowerCaseServiceId: true
          enabled: true
          ## &#x914D;&#x7F6E;&#x4E0B;&#x9762;&#x8FD9;&#x4E2A;&#x9ED8;&#x8BA4;&#x4F1A;&#x5339;&#x914D;&#x4EE5;&#x670D;&#x52A1;&#x540D;&#x4E3A;&#x524D;&#x7F00;&#x7684;&#x8DEF;&#x7531;&#xFF0C;&#x5C31;&#x4E0D;&#x9700;&#x8981;&#x5728;nacos&#x91CC;&#x9762;&#x914D;&#x7F6E;&#x8DEF;&#x7531;&#x4E86;
          filters:
            - name: RewritePath
              args:
                regexp: "'/' + serviceId + '/(?<remaining>.*)'"
                replacement: "'/' + serviceId + '/${remaining}'"
      default-filters:
        - DedupeResponseHeader=Access-Control-Allow-Origin
      globalcors:
        add-to-simple-url-handler-mapping: true
        corsConfigurations:
          '[/**]':
            allowed-origins: "*"
            allowed-methods: "*"
            allowed-headers: "*"
            allow-credentials: true
      httpclient:
        response-timeout: 60000
        connect-timeout: 60000
    loadbalancer:
      ribbon:
        enabled: false
  application:
    name: gateway
  sleuth:
    enabled: false
    http:
      legacy:
        enabled: true
  main:
    allow-bean-definition-overriding: true
  codec:
    max-in-memory-size: 20MB
management:
  endpoints:
    web:
      exposure:
        include: '*'
        exclude: heapdump,dump,threaddump,configprops,env
  security:
    enabled: false

gate:
  ignore:
    startWith: /auth/jwt,/auth/captcha

ribbon:
  eureka:
    enabled: true
  ReadTimeout: 60000
  ConnectTimeout: 60000
  MaxAutoRetries: 0
  MaxAutoRetriesNextServer: 1
  OkToRetryOnAllOperations: false

hystrix:
  threadpool:
    default:
      coreSize: 1000 ##&#x5E76;&#x53D1;&#x6267;&#x884C;&#x7684;&#x6700;&#x5927;&#x7EBF;&#x7A0B;&#x6570;&#xFF0C;&#x9ED8;&#x8BA4;10
      maxQueueSize: 1000 ##BlockingQueue&#x7684;&#x6700;&#x5927;&#x961F;&#x5217;&#x6570;
      queueSizeRejectionThreshold: 500 ##&#x5373;&#x4F7F;maxQueueSize&#x6CA1;&#x6709;&#x8FBE;&#x5230;&#xFF0C;&#x8FBE;&#x5230;queueSizeRejectionThreshold&#x8BE5;&#x503C;&#x540E;&#xFF0C;&#x8BF7;&#x6C42;&#x4E5F;&#x4F1A;&#x88AB;&#x62D2;&#x7EDD;
  command:
    default:
      execution:
        isolation:
          thread:
            timeoutInMilliseconds: 10000
            timerDelayInMilliseconds: 10000
</remaining>

3.bootstrap.yml 配置文件

#&#x670D;&#x52A1;&#x914D;&#x7F6E;
server:
  port: 8000
  max-http-header-size: 10240

spring:
  application:
    name: gateway
  profiles:
    active: @spring.active@
  servlet:
    multipart:
      max-request-size: 100MB
      max-file-size: 100MB

logging:
  file:
    path: logs/
spring:
  profiles: dev
  cloud:
    nacos:
      config:
        server-addr: https://api.zhouhong.icu
        namespace: 07610e11-85ae-49cb-aa46-b8f0802543bd
        file-extension: yml
        username: nacos
        password: nacos
      discovery:
        server-addr: https://api.zhouhong.icu
        namespace: 07610e11-85ae-49cb-aa46-b8f0802543bd
        username: nacos
        password: nacos
spring:
  profiles: local
  cloud:
    nacos:
      config:
        server-addr: https://api.zhouhong.icu
        namespace: 4d7c95f1-21d5-43ad-a420-5eebb2473751
        file-extension: yml
        username: nacos
        password: nacos
      discovery:
        server-addr: https://api.zhouhong.icu
        namespace: 4d7c95f1-21d5-43ad-a420-5eebb2473751
        username: nacos
        password: nacos
spring:
  profiles: prod
  cloud:
    nacos:
      config:
        server-addr: https://api.zhouhong.icu
        namespace: 01940467-9f25-45e3-b9b8-1ad25c937544
        file-extension: yml
        extension-configs:
      discovery:
        server-addr: https://api.zhouhong.icu
        namespace: 01940467-9f25-45e3-b9b8-1ad25c937544

这里只是为了测试简单写了两个controller方法

/**
     * &#x670D;&#x52A1;&#x540D;&#x79F0;&#x548C;&#x63A5;&#x53E3;&#x7B2C;&#x4E00;&#x6BB5;&#x5B57;&#x7B26;&#x5339;&#x914D;
     * @return
     */
    @PostMapping("/server1/test")
    public String theSameServer() {
        return "&#x4F60;&#x597D;&#x5440;( &#x2299; o &#x2299; )&#xFF01;";
    }

    /**
     * &#x670D;&#x52A1;&#x540D;&#x79F0;&#x548C;&#x63A5;&#x53E3;&#x7B2C;&#x4E00;&#x6BB5;&#x5B57;&#x7B26;&#x4E0D;&#x5339;&#x914D;
     * @return
     */
    @PostMapping("/serverNotSame/test")
    public String gettoken() {
        return "&#x4F60;&#x597D;&#x5440;( &#x2299; o &#x2299; )&#xFF01;";
    }

5、综合测试

A.部署说明:

1.项目中我按照正常的公司开发形式,指定了 本地(local)、测试/开发(dev)、生产(prod)环境,搭建阔以按照自己的需求进行取舍;

2.本次测试我用测试环境进行演示、大家需要在nacos上建立与环境对应的命名空间(local、dev、prod),并且需要在网关和自己业务服务里面指定对应的环境和nacos配置;

3.之前说过nacos开启了用户鉴权,所以需要在discovery 和 config 下面配置登录时的用户名以及密码

4.本项目实现的是根据服务名称自动匹配接口前缀,至于根据nacos路由列表匹配大家可以自行百度。

B.部署

1.打包:需要选择对应的环境,我这里使用测试环境(dev)如图所示:

Nacos + Gateway网关搭建微服务

2.需要打包网关和业务服务两个服务,最终会得到 gateway.jar 和 server1.jar两个jar包,然后上传服务器

3.部署(我这里为了方便就不需要进行docker部署了)直接使用 java -jar XXX.jar 进行简单部署了

部署成功后在nocos控制台查看服务是否注册成功

Nacos + Gateway网关搭建微服务
如果服务列表为这个熊样,就说明部署成功,接下来就可以测试啦

4.接口测试

使用PostMan进行接口调用

Nacos + Gateway网关搭建微服务
如图所示调用成功(因为yml里面那个配置,它会自动根据服务名称 server1 进行匹配)
B 调用与服务名称不匹配的那个接口

Nacos + Gateway网关搭建微服务
拦截成功

Original: https://www.cnblogs.com/Tom-shushu/p/16557185.html
Author: Tom-shushu
Title: Nacos + Gateway网关搭建微服务

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/608165/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 远程互动会议平台是什么?

    关于Teamind Teamind 是新一代的远程互动会议平台。基于 Teamind 无限延伸、任意缩放的在线白板上,每一个参与者都可以利用便签、图形、手绘、图片等各种各样的元素进…

    Java 2023年6月13日
    069
  • java 代码的良好习惯

    有很多书籍提到了代码开发的良好习惯,但是自己看过后,在开发中并不能每次都想起来。在此处开贴做笔记,以后自己开发的代码,必须符合。 不要在一个代码块的开头把局部变量一次性都声明了(这…

    Java 2023年5月29日
    060
  • 实现多线程大的三种方式,超级简单的教程

    一。实现多线程的第一种方式 1.继承Thread类 2.启用这个线程 二。实现多线程的第二种方式 1. 实现Runnable接口 2.启用这个线程 三。实现多线程的第三种方式(注意…

    Java 2023年6月9日
    062
  • springboot+MessageSource实现国际化

    1、springboot自带,不需要引入任何依赖 2、在resource下建立:i18n/messages.properties 3、在application.yml增加以下内容 …

    Java 2023年5月30日
    069
  • (转)白话数字签名(1)——基本原理

    摘要本系列通过通俗易懂的讲解,让您就像读小说一般,轻轻松松就能理解数字签名的基本原理和应用方法(即使您是一个并不精通计算机的企业老总,也能读懂本篇文章)。然后我们再逐步深入技术细节…

    Java 2023年6月15日
    0117
  • HTML笔记整理–下节

    欢迎来到HTML基础笔记下节部分! 内联样式 当特殊的样式需要应用到个别元素时,就可以使用内联样式。 使用内联样式的方法是在相关的标签中使用样式属性。样式属性可以包含任何 CSS …

    Java 2023年6月7日
    082
  • Hibernate基础入门

    hibernate的基本概念 hibernate是 轻量级的 ORM 框架,ORM全称object/relation mapping [对象/关系 映射]。 orm概念 对象关系映…

    Java 2023年6月9日
    077
  • Spring Security系列之极速入门与实践教程

    @ 1. Spring Security 2. 实验环境准备 3. 日志级别修改 4. 配置用户名/密码 5. 数据库方式校验 6. 不拦截静态资源 7. 自定义登录页面 8. R…

    Java 2023年5月30日
    081
  • MYSQL 免安装

    本文使用mysql 8.0.22进行演示 一、MYSQL 下载 官网下载:地址:https://dev.mysql.com/downloads/mysql/ 阿里云盘:链接:htt…

    Java 2023年6月5日
    0134
  • JVM与GC调优《大厂学院》

    • JVM架构图? • class文件里是什么? • javac编译器编译步骤? • 什么是字节码指令? • 如何解读class文件? • 常量池是什么? • 常见字节码指令有哪些…

    Java 2023年6月7日
    069
  • 源码中的设计模式–装饰器模式

    一、模式入场 有一句很经典的小品台词是”换个马甲我就不认识你了吗”,哈哈,这个比方正好用在今天要分享的装饰器模式上。先看下《head first 设计模式》…

    Java 2023年6月9日
    073
  • SpringBoot 整合 MongoDB 实战解说

    在前面的文章中,我们详细的介绍了 MongoDB 的配置和使用,如果你对 MongoDB 还不是很了解,也没关系,在 MongoDB 中有三个比较重要的名词: 数据库、集合、文档!…

    Java 2023年6月9日
    076
  • 【Java面试】面试官为了装X故意为难问你,为什么加索引能提升查询效率?如何回答才能惊呆他!

    “为什么加索引能提升查询效率”! 我们都认为”加索引”提升查询效率是理所应当的竟然还有理由? 该怎么回答呢?大家好,我是Mic,一个…

    Java 2023年6月16日
    076
  • MySQL索引凭什么能让查询效率提高这么多?

    我相信大家在数据库优化的时候都会说到索引,我也不例外,大家也基本上能对数据结构的优化回答个一二三,以及页缓存之类的都能扯上几句,但是有一次阿里P9的一个面试问我:你能从计算机层面开…

    Java 2023年6月9日
    0142
  • CocosCreator中worldMatrix到底是什么(中)

    Cocos Creator 中 _worldMatrix 到底是什么(中) 1. 中篇摘要 在上篇中主要做了三件事 简单表述了矩阵的基本知识,以及需要涉及到的三角函数知识 推导了图…

    Java 2023年6月13日
    068
  • Ajax结合THymeleaf使用

    <script type="text/javascript"> //通过$("标签…

    Java 2023年6月5日
    085
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球