前言:
最近把SpringCloud 全家桶切换到k8s集群上,第一步就是把注册中心去掉. 注册中心的核心的作用: 服务发现和服务间调用. 那么K8s是如何实现服务间调用的呢?
本人在github/csdn等平台上,找了很多,发现对服务之间的调用demo都非常少,希望这个对大家开发有所帮助.
服务发现:
很多团队在从SpringCloud切换到K8s时,把Netflix的Eureka注册中心和各个微服务同时迁移到k8s. 核心的思路是:
1. k8s负责服务编排;
2. Eureka负责注册中心和服务发现;
这种方式比较适合公司规模不大,业务模块相对较少. 对于中/大型公司来讲,SpringCloud面临一些问题:
1. 自动化部署和运维;
2. 微服务的多语言开发;
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(负载均衡)
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
<version>2.2.5.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-kubernetes-ribbon</artifactId>
<version>1.1.6.RELEASE</version>
</dependency>
客户端请求代码:
@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环境搭建和常见问题:
//www.greatytc.com/p/2ee6ed1273a1