# 使用K8S实现不用Feign直接调用服务

作为一名经验丰富的开发者,我来教你如何在Kubernetes(K8S)环境中实现不使用Feign而直接调用服务的方法。Feign是一个基于Netflix开源的HTTP客户端,用于简化HTTP客户端的开发。但有时候我们可能需要绕过Feign直接调用服务,这时候就可以利用K8S的服务发现和负载均衡功能来实现。

在K8S中,每个部署的服务都会被分配一个集群内部的DNS名称,可以通过这个名称来直接访问其他服务,而不需要通过Feign来实现服务发现和负载均衡。

接下来我将详细介绍整个流程,并给出每个步骤需要做的事情以及代码示例。

## 使用K8S实现不用Feign直接调用服务流程

| 步骤 | 操作 |
| -------- | ----- |
| 步骤一 | 在K8S集群中创建服务(Service) |
| 步骤二 | 查询服务的DNS名称 |
| 步骤三 | 直接调用服务 |

### 步骤一:在K8S集群中创建服务(Service)

首先,我们需要在K8S中创建一个服务,可以通过Deployment或者StatefulSet创建应用程序,然后通过Service暴露应用程序的端口。

```yaml
apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
selector:
app: my-app
ports:
- protocol: TCP
port: 80
targetPort: 8080
```

在上面的示例中,我们创建了一个名为my-service的Service,它将端口80映射到后端应用程序的端口8080。

### 步骤二:查询服务的DNS名称

K8S会为每个Service分配一个内部DNS名称,我们可以通过这个名称来直接访问该服务。

```bash
kubectl get services
```

通过上面的命令,我们可以查看K8S集群中所有Service的信息,包括名称、Cluster IP、端口等信息。

### 步骤三:直接调用服务

最后,我们可以通过服务的DNS名称直接调用服务,无需使用Feign或其他HTTP客户端库。

```java
String serviceName = "my-service.default.svc.cluster.local";
String url = "http://" + serviceName + "/api/resource";
HttpURLConnection connection = (HttpURLConnection) new URL(url).openConnection();
connection.setRequestMethod("GET");

int responseCode = connection.getResponseCode();
if (responseCode == HttpURLConnection.HTTP_OK) {
// 读取响应数据
}
```

在上面的示例中,我们直接使用Java中的HttpURLConnection来发起GET请求,url为服务的DNS名称加上具体的接口路径。

通过上述步骤,我们就可以不使用Feign而直接在K8S环境中调用服务了。希望这篇文章对你有所帮助!