springcloud gateway+nacos+dubbo

nacos搭建

nacos官方文档 https://nacos.io/zh-cn/docs/quick-start.html

  1. 下载nacos压缩包 或者源码
  2. 启动项目
    • 解压项目
    • sh startup.sh -m standalone
  3. 关系服务
    • sh shutdown.sh

nacos默认的端口号为8848
如果要修改只需要修改
nacos/conf/application.properties
文件下的server.port就可以了

搭建基于springcloud的dubbo服务

provider

pom文件配置

    <properties>
        <java.version>1.8</java.version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        //springboot版本 消费端的版本一致
        <spring-boot.version>2.3.7.RELEASE</spring-boot.version>
        //springcloud 版本 消费端的版本一致
        <spring-cloud-alibaba.version>2.2.2.RELEASE</spring-cloud-alibaba.version>
    </properties>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
        //nacos 配置中心
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        </dependency>
        //nacos 注册中心
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
        //dubboo 依赖
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-dubbo</artifactId>
        </dependency>
# 应用名称
spring.application.name=spt-user

# dubbo 协议
dubbo.protocol.id=dubbo
dubbo.protocol.name=dubbo
# dubbo 协议端口( -1 表示自增端口,从 20880 开始)
dubbo.protocol.port=-1
# Dubbo 消费端订阅服务端的应用名,多个服务提供者用逗号分隔
# 这里订阅"自己",会被忽略掉,请根据实际情况添加
dubbo.cloud.subscribed-services=spt-user

# dubbo 服务扫描基准包
dubbo.scan.base-packages=com.spt.user
#dubbo的注册地址如果没有 默认挂在到springcloud 所以用springcloud 就可以不用写了
#dubbo.registry.address=spring-cloud://localhost

# Nacos认证信息
spring.cloud.nacos.discovery.username=nacos
spring.cloud.nacos.discovery.password=nacos
# Nacos 服务发现与注册配置,其中子属性 server-addr 指定 Nacos 服务器主机和端口
spring.cloud.nacos.discovery.server-addr=10.73.98.45:8848
# 注册到 nacos 的指定 namespace,默认为 public
spring.cloud.nacos.discovery.namespace=public
#server.port=8081
spring.profiles.active=public

接口+实现类

//接口类 
public interface TestFacade {

    ResponseDto<TestVo> test(TestRequest testRequest);
}

//实现类
//dubbo 注解 服务启动的时候回扫描带dubboservice的注解 然后根据我们配置的协议转换成对应的协议头开头的请求地址
@DubboService(protocol = "dubbo")
public class TestFacadeImpl implements TestFacade {

    @Autowired
    TestBiz testBiz;
    //这里就是一个简单的test方法
    @Override
    public ResponseDto<TestVo> test(TestRequest testRequest) {
        ResponseDto<TestVo> responseDto = new ResponseDto<>();
        TestVo vo = testBiz.abc(testRequest);
        responseDto.setData(vo);
        return responseDto;
    }
}

consumer

pom文件配置

       <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
        //作为聚合层对外输出,需要用到controller 
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        </dependency>
        <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-dubbo</artifactId>
        </dependency>
# 应用名称
# 应用名称
spring.application.name=api-server
# dubbo 协议
dubbo.protocol.id=dubbo
dubbo.protocol.name=dubbo
# dubbo 协议端口( -1 表示自增端口,从 20880 开始)
dubbo.protocol.port=-1

# 这里订阅服务端的application.name
dubbo.cloud.subscribed-services=spt-user
# dubbo 服务扫描基准包
dubbo.scan.base-packages=com.spt.api
#启动的时候不校验服务端是否启动
dubbo.consumer.check=false

# Nacos帮助文档: https://nacos.io/zh-cn/docs/concepts.html
# Nacos认证信息
spring.cloud.nacos.discovery.username=nacos
spring.cloud.nacos.discovery.password=nacos
# Nacos 服务发现与注册配置,其中子属性 server-addr 指定 Nacos 服务器主机和端口
spring.cloud.nacos.discovery.server-addr=10.73.98.45:8848
# 注册到 nacos 的指定 namespace,默认为 public
spring.cloud.nacos.discovery.namespace=public

server.port=8082

服务端代码

@RestController
public class TestController {

    @DubboReference
    TestFacade testFacade;

    Logger logger = LoggerFactory.getLogger(TestController.class);

    @GetMapping(value = "test")
    public String test(Integer flag){
        TestRequest testRequest = new TestRequest();
        testRequest.setFlag(flag);
        ResponseDto<TestVo> responseDto =  testFacade.test(testRequest);
        logger.info(responseDto.toString());
        if(responseDto.isSuccess()){
            return "success";
        }
        return "fail";
    }

}

gateway

springcloud alibaba gateway 提供了一个用于在Spring WebFlux之上构建API网关的库。Spring Cloud Gateway旨在提供一种简单而有效的方法来路由到API,并为它们提供跨领域的关注点,例如:安全性,监视/指标和弹性。

pom文件

<dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
        //最新的gateway版本提供了与sentinel合并的依赖包 不影响只是用gateway
        <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-nacos-discovery</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-gateway</artifactId>
            <version>2.2.2.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba.csp</groupId>
            <artifactId>sentinel-datasource-nacos</artifactId>
        </dependency>
    </dependencies>
# 应用名称
spring.application.name=spt-gateway
server.port=8900

spring.main.allow-bean-definition-overriding=true
#nacos注册中心配置
spring.cloud.nacos.discovery.username=nacos
spring.cloud.nacos.discovery.password=nacos
spring.cloud.nacos.discovery.server-addr=10.73.98.45:8848
spring.cloud.nacos.discovery.namespace=public

spring.cloud.gateway.discovery.locator.lower-case-service-id=true
#是否开始服务注册和发现功能,以为我们是要发现api-server服务,所以开启
spring.cloud.gateway.discovery.locator.enabled=true

//具体的路由规则
//id是随意定义的 sentinel配置限流能用到id
spring.cloud.gateway.routes[0].id=web
//lb 表示挂载到注册中心,会从注册中心找到api-server的服务列表,然后进行路由,默认问轮询
spring.cloud.gateway.routes[0].uri=lb://api-server
//表示test开头的会请求转发到 api-server
spring.cloud.gateway.routes[0].predicates[0]=Path=/test/acb/**
//表示请求转发的时候会去掉最前面的一级目录  ip:port/acb/**
spring.cloud.gateway.routes[0].filters[0]=StripPrefix=1

spring.cloud.gateway.routes[1].id=auth
spring.cloud.gateway.routes[1].uri=lb://spt-auth
spring.cloud.gateway.routes[1].predicates[0]=Path=/auth/**
spring.cloud.gateway.routes[1].filters[0]=StripPrefix=0
#spring.cloud.gateway.routes[1].filters[1]=LogFilterFactory=true

#这块是sentinel的配置 
spring.cloud.sentinel.transport.dashboard=127.0.0.1:8085
spring.cloud.sentinel.datasource.ds.nacos.server-addr=10.73.98.45:8848
spring.cloud.sentinel.datasource.ds.nacos.data-id=sentinel
spring.cloud.sentinel.datasource.ds.nacos.username=nacos
spring.cloud.sentinel.datasource.ds.nacos.password=nacos
spring.cloud.sentinel.datasource.ds.nacos.group-id=DEFAULT_GROUP
spring.cloud.sentinel.datasource.ds.nacos.data-type=json
spring.cloud.sentinel.datasource.ds.nacos.rule-type=degrade

Golbalfilter 在gateway 中基本都会用到,一般会作为鉴权,请求url,参数日志打印等


@Component("authFilter")
public class Authfilter implements GlobalFilter, Ordered {

    Logger logger = LoggerFactory.getLogger(this.getClass());
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {

        String path = exchange.getRequest().getURI().getPath();
        logger.info("path:{}",path);
        //过滤不需要拦截的url
        if(path.startsWith("/auth/login")){
            Mono<Void> filter = chain.filter(exchange);
            return filter;
        }
        //token校验
        ServerHttpRequest request = exchange.getRequest();
        HttpHeaders header = request.getHeaders();
        String token = header.getFirst("token");
        System.out.println("token="+token);
        ServerHttpResponse response = exchange.getResponse();
        if (StringUtils.isBlank(token)) {
            System.out.println("token not found");
            response.setStatusCode(HttpStatus.UNAUTHORIZED);
            return response.setComplete();
        }


        return chain.filter(exchange);
    }

    @Override
    public int getOrder() {
        return 10;
    }
}

@Configuration
public class GatewayConfiguration {

    @Autowired
    private Authfilter authfilter;

}
?著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,172评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,346评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事?!?“怎么了?”我有些...
    开封第一讲书人阅读 159,788评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,299评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,409评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,467评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,476评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,262评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,699评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,994评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,167评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,827评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,499评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,149评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,387评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,028评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,055评论 2 352

推荐阅读更多精彩内容