kubernetes[k8s]服务间通讯[调用]

前言:

     最近把SpringCloud 全家桶切换到k8s集群上,第一步就是把注册中心去掉. 注册中心的核心的作用: 服务发现和服务间调用. 那么K8s是如何实现服务间调用的呢?
     本人在github/csdn等平台上,找了很多,发现对服务之间的调用demo都非常少,希望这个对大家开发有所帮助.

服务发现:

     很多团队在从SpringCloud切换到K8s时,把Netflix的Eureka注册中心和各个微服务同时迁移到k8s. 核心的思路是:
      1. k8s负责服务编排;
      2. Eureka负责注册中心和服务发现;
     这种方式比较适合公司规模不大,业务模块相对较少. 对于中/大型公司来讲,SpringCloud面临一些问题:
      1. 自动化部署和运维;
      2. 微服务的多语言开发;

SpringCloud vs K8s


K8s服务间调用:

      1. k8s服务端(被调用方)不需要依赖任何中间件,只需要提供restful的服务, 不依赖服务端是何种语言实现(SpringCloud Eureka注册中心的服务必须是java实现);
      2. 客户端通过服务名访问服务端, 并支持负载均衡;
      **3. K8s中的服务名必须和spring.application.name一致;
      **4. 如何客户端和服务不在k8s中的同一个命名空间,需要在yml制定服务的命名空间,否则请求不到(默认只搜索同一命名空间服务);
以下以Springboot工程为例:
服务端:简单的web service,不依赖SpringCloud;

@Slf4j
@RestController
public class TestController {

    @GetMapping("/health")
    public String health(){
        log.info("server health");
        return "hello2";
    }

    @GetMapping("/test")
    public String test(){
        log.info("server test");
        return "test2";
    }
}

客户端: 使用Springboot作为客户端,核心依赖openfeign(请求转换), kubernetes-ribbon(负载均衡)

        
            org.springframework.cloud
            spring-cloud-starter-openfeign
            2.2.5.RELEASE
        

        
            org.springframework.cloud
            spring-cloud-starter-kubernetes-ribbon
            1.1.6.RELEASE
        

客户端请求代码:

@FeignClient("kesapp")//, fallback = UserClientFallback.class
public interface TestService  {
//    @GetMapping("/health")
    @RequestMapping(method = RequestMethod.GET, value = "/health", consumes = MediaType.APPLICATION_JSON_VALUE)
    public String health();

//    @GetMapping("/test")
    @RequestMapping(method = RequestMethod.GET, value = "/test", consumes = MediaType.APPLICATION_JSON_VALUE)
    public String test();
}

Controller代码


@Slf4j
@RestController
public class TestController {

    @Autowired
    TestService serviceClient;

    @GetMapping("/server_health")
    public String health_server(){
        log.info("client->server health");
        return serviceClient.health();
    }

    @GetMapping("/server_test")
    public String test_server(){
        log.info("client->server test");
        return serviceClient.test();
    }

    @GetMapping("/health")
    public String health(){
        log.info("client health");
        return "health3";
    }

    @GetMapping("/test")
    public String test(){
        log.info("client test");
        return "test";
    }
}

代码地址:
https://github.com/LovelyLittleDemon/kubernetes_service_call

minikube环境搭建和常见问题:
https://www.jianshu.com/p/2ee6ed1273a1

你可能感兴趣的:(kubernetes[k8s]服务间通讯[调用])