23.Gateway 动态路由,负载均衡(springcloud)

news/2024/7/10 2:46:21 标签: spring cloud, gateway, 负载均衡
1 概述
从之前的配置里面我们可以看到我们的 URL 都是写死的,这不符合我们微服务的要求,我们微服务是只要知道服务的名字,根据名字去找,而直接写死就没有负载均衡的效果了 默认情况下 Gateway 会根据注册中心的服务列表,以注册中心上微服务名为路径创建动态路 由进行转发,从而实现动态路由的功能。
需要注意的是 uri 的协议为 lb( load Balance ),表示启用 Gateway 的负载均衡功能。
lb://serviceName 是 spring cloud gateway 在微服务中自动为我们创建的负载均衡 uri
协议:就是双方约定的一个接头暗号
http //
项目实例

1.gateway-server模块

1.1.pom.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.3.12.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.it</groupId>
    <artifactId>gateway-server</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>gateway-server</name>
    <description>Demo project for Spring Boot</description>
    <properties>
        <java.version>1.8</java.version>
        <spring-cloud.version>Hoxton.SR12</spring-cloud.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-gateway</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-netflix-eureka-client</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

1.2.application.yml文件

server:
  port: 80
spring:
  application:
    name: gateway-server
  cloud:
    gateway:
      enabled: true
      discovery:
        locator:
          enabled: true #开启动态路由  开启通过应用名称找到服务的功能
          lower-case-service-id: true #开启服务名称小写
eureka:
  client:
    service-url:
      defaultZone: http://192.168.174.133:8761/eureka
    registry-fetch-interval-seconds: 3
  instance:
    hostname: localhost
    instance-id: ${eureka.instance.hostname}:${spring.application.name}:${server.port}

1.3主函数类

package com.it;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;

@SpringBootApplication
@EnableEurekaClient
public class GatewayServerApplication {

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

}

2.login-service模块

2.1.pom.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.3.12.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.it</groupId>
    <artifactId>login-service</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>login-service</name>
    <description>Demo project for Spring Boot</description>
    <properties>
        <java.version>1.8</java.version>
        <spring-cloud.version>Hoxton.SR12</spring-cloud.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-netflix-eureka-client</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

2.2.application.yml文件

server:
  port: 8081
spring:
  application:
    name: login-service
eureka:
  client:
    service-url:
      defaultZone: http://192.168.174.133:8761/eureka
    registry-fetch-interval-seconds: 3
  instance:
    hostname: localhost
    instance-id: ${eureka.instance.hostname}:${spring.application.name}:${server.port}

2.3.LoginController文件

package com.it.controller;

import org.springframework.web.bind.annotation.GetMapping;

import java.util.UUID;

public class LoginController {

    @GetMapping("doLogin")
    public String doLogin(String name,String pwd){
        System.out.println(name);
        System.out.println(pwd);
        String s = UUID.randomUUID().toString();
        return s;
    }

}

2.4主函数类

package com.it;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;

@SpringBootApplication
@EnableEurekaClient
public class LoginServiceApplication {

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

}

3.功能测试

启动动态路由后,访问路径时需要在localhost后面加上,要访问服务的名称,后面再跟上这个服务中的方法接口名

如果不加服务名称,还是按照以前的方法写,会导致访问报404


http://www.niftyadmin.cn/n/5599.html

相关文章

Spring MVC 如何开发REST风格的应用呢?

转自: Spring MVC 如何开发REST风格的应用呢&#xff1f; REST&#xff08;Representational State Transfer&#xff09;:表述性转移&#xff0c;是目前最流行的一种软件架构风格。它结构清晰、易于理解、有较好的扩展性。 Spring REST 风格:使用 URL 表示资源时&#xff0c…

pandas基础-pandas之Series+ 读取外部数据+dataframe+dataframe的索引

目录 pandas之Series pandas之series创建 pandas之Series切片和索引 pandas之series的索引和值​编辑 pandas之读取外部数据 pandas之dataframe pandas之dataframe的创建 传入字典创建数据 dataframe的描述信息 dataframe的索引 pandas之loc pandas之iloc pandas之布尔索…

【jquery ajax】实现文件上传提交

✍️ 作者简介: 前端新手学习中。 &#x1f482; 作者主页: 作者主页查看更多前端教学 &#x1f393; 专栏分享&#xff1a;css重难点教学 Node.js教学 从头开始学习 ajax学习 在这里看原生ajax实现文件上传 文章目录JQuery实现文件上传提交  定义UI结构  验证是否选择了…

带你手撕八大排序

目录一、排序的基础知识1.排序的概念2.排序的应用3.常见的排序算法二、八大排序的实现1.插入排序-直接插入排序直接插入排序的特性总结2.插入排序-希尔排序希尔排序的特性总结3.选择排序-直接选择排序直接插入排序特性总结4.选择排序-堆排序堆排序的特性总结5.交换排序-冒泡排序…

java-net-php-python-springtboot校园信息交流互助系统计算机毕业设计程序

java-net-php-python-springtboot校园信息交流互助系统计算机毕业设计程序 java-net-php-python-springtboot校园信息交流互助系统计算机毕业设计程序本源码技术栈&#xff1a; 项目架构&#xff1a;B/S架构 开发语言&#xff1a;Java语言 开发软件&#xff1a;idea eclipse…

C语言之位域(位段)入门详解

一、引言 信息处理中&#xff0c;有些信息在存储时&#xff0c;并不需要占用一个完整的字节&#xff0c;而只需占一个或几个比特位。例如在存放一个开关量时&#xff0c;只有0和1 两种状态&#xff0c; 用一位二进制位即可。为了节省存储空间&#xff0c;并使处理简便&#xf…

基于组件的软件设计

世界是复杂的&#xff0c;值得幸运的是&#xff0c;复杂的世界是由小生大&#xff0c;由简入繁。人类研究复杂世界的方法是将复杂的事物逐一分解成已经了解的简单事物&#xff0c;并且研究这些简单事物的相互作用产生的系统特性。人类认识世界的方式如此&#xff0c;在此基础上…

13届蓝桥杯省赛PythonB组真题-蜂巢

蜂巢题目本身难度并不大&#xff0c;使用枚举方法就可以求解&#xff0c;但在编程中还是有坑的&#xff08;文末最后提到&#xff09;。解题思路&#xff1a; 1.先把蜂巢坐标系(d, p, q)转换为直角坐标系(x, y)&#xff0c;不妨把正六边形中心到各边的距离记作1. 则沿6各方向…