go语言实现gateway简单样例

目录

1、代码实现样例:

2、postman调用


1、代码实现样例:

gateway转发的url根据实际去调整,转发访问的url是否存在token,也根据实际情况去调整:

复制代码
package main

import (
	"fmt"
	"io/ioutil"
	"log"
	"net/http"

	"github.com/afex/hystrix-go/hystrix"
	"github.com/gin-gonic/gin"
)

func main() {
	r := gin.Default()

	// 设置路由
	r.GET("/service/:service", handleRequest)

	// 启动服务
	if err := r.Run(":8081"); err != nil {
		log.Fatalf("Failed to start server: %v", err)
	}
}

func handleRequest(c *gin.Context) {
	service := c.Param("service")
	commandName := "service_" + service

	// 使用 Hystrix 实现服务熔断
	hystrix.ConfigureCommand(commandName, hystrix.CommandConfig{
		Timeout:               1000, // 超时时间(毫秒)
		MaxConcurrentRequests: 100,  // 最大并发请求数
		ErrorPercentThreshold: 25,   // 错误百分比阈值
	})

	hystrix.Do(commandName, func() error {
		// 获取客户端传入的 token
		token := c.GetHeader("Authorization")

		fmt.Println("token", token)

		// 创建请求
		req, err := http.NewRequest("GET", "http://localhost:8080/"+service, nil)
		if err != nil {
			return err
		}

		// 添加认证 token
		req.Header.Set("Authorization", token)

		// 发送请求
		resp, err := http.DefaultClient.Do(req)
		if err != nil {
			return err
		}
		defer resp.Body.Close()

		body, err := ioutil.ReadAll(resp.Body)
		// 将目标服务的响应返回给客户端
		c.Status(resp.StatusCode)
		fmt.Println("status:", string(body))
		_, err = c.Writer.Write(body)
		return err
	}, func(err error) error {
		// 处理熔断
		c.JSON(http.StatusServiceUnavailable, gin.H{"error": "Service unavailable"})
		return nil
	})
}

2、postman调用

使用先前生成的token,服务转发的之前服务的url,参看我上一篇文章:

相关推荐
古城小栈几秒前
Go 异步编程:无锁数据结构实现原理
java·数据结构·golang
qq_172805592 分钟前
Modbus Server数据采集Web之Server端模拟功能
前端·后端·golang·modbus
爱吃大芒果4 分钟前
Flutter 列表优化:ListView 性能调优与复杂列表实现
开发语言·hive·hadoop·flutter·华为
啃火龙果的兔子14 分钟前
Java 学习路线及学习周期
java·开发语言·学习
电饭叔19 分钟前
自定义重载运算符--《python语言程序设计》2018版--第8章20题使用Rational类求和数列之一
开发语言·python
济南壹软网络科技有限公司20 分钟前
高并发电商实战:基于Java生态的多元化盲盒系统技术实现方案
java·开发语言·开源·盲盒源码·盲盒定制开发
獭.獭.23 分钟前
C++ -- 位图与布隆过滤器
开发语言·c++
工具人555525 分钟前
python 环境问题
开发语言·python
小年糕是糕手25 分钟前
【C++】string类(二)
开发语言·数据结构·c++·程序人生·算法·leetcode·数字货币
小鸡吃米…26 分钟前
Python编程语言面试问题三
开发语言·python·面试