springcloud之服务提供与负载均衡调用 Eureka

前言

提供一个基于Eurka的服务注册中心,两个服务提供者之后分别使用Ribbon、Fegin方式进行调用,测试负载均衡。

服务提供者Service Provider 本质上是一个 Eureka Client,它在服务启动时,会调用服务注册方法,向 Eureka Server注册接口服务信息,包括地址、端口、服务名、入参、返回值等。当Eureka Server收到注册信息后,会维护在自己的注册列表,如下;

java 复制代码
private final ConcurrentHashMap<String, Map<String, Lease<InstanceInfo>>> registry
        = new ConcurrentHashMap<String, Map<String, Lease<InstanceInfo>>>();

服务消费者Service Consumer 本质也是一个 Eureka Client,它在服务启动时,也会向 Eureka Server 注册服务信息。同时在启动后会从Eureka Server 上获取所有实例的注册信息,包括 IP 地址、端口等,并缓存到本地。这个获取有一定的延时,因此我们在实际开发过程中如果服务方尚未启动完成,调用方不要着急启动避免造成调用失败。

EurekaClientController.java | 注意@EnableEurekaClient用于向注册中心提供服务

java 复制代码
@EnableEurekaClient
@RestController
public class EurekaClientController {

    @Value("${server.port}")
    private int port;

    @RequestMapping(path = "/api/queryUserInfo", method = RequestMethod.GET)
    public String queryUserInfo(@RequestParam String userId) {
        return "Hi 明哥 | " + userId + " >: from eureka client port: " + port;
    }

}

EurekaClientApplication.java | 服务启动类

java 复制代码
@SpringBootApplication
public class EurekaClientApplication {

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

}
 

application.yml | 配置文件链接服务注册中心,8001\8002分别配置启动

yaml 复制代码
server:
  port: 8001 / 8002

spring:
  application:
    name: demo-springcloud-eureka-client

eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:7397/eureka/

单个服务注册中心

服务注册中心用于承载接口提供方向上注册,同时正在调用方链接后可以获取指定应用的服务实例。

EurekaServerApplication.java | 通过注解@EnableEurekaServer启动服务注册与发现中心

java 复制代码
@SpringBootApplication
@EnableEurekaServer
public class EurekaServerApplication {

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

}

application.yml | 服务注册中心配置文件,端口7397和我们之前写netty的服务的端口一致

yaml 复制代码
server:
  port: 7397

eureka:
  instance:
    hostname: localhost
  client:
    registerWithEureka: false
    fetchRegistry: false
    serviceUrl:
      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/

spring:
  application:
    name: demo-springcloud-eureka-server

Feign服务调用方

Feign 是一个声明式的 Web Service 客户端,它的目的就是让 Web Service 调用更加简单。它整合了 Ribbon 和 Hystrix,从而让我们不再需要显式地使用这两个组件。Feign 还提供了 HTTP 请求的模板,通过编写简单的接口和插入注解,我们就可以定义好 HTTP 请求的参数、格式、地址等信息。接下来,Feign 会完全代理 HTTP 的请求,我们只需要像调用方法一样调用它就可以完成服务请求。

service/FeignService.java | 注解方式调用,方便易用。@FeignClient会在调用时进行解析服务到具体的http://ip:port/

java 复制代码
@FeignClient(value = "demo-springcloud-eureka-client")
public interface FeignService {

    @RequestMapping(value = "/api/queryUserInfo", method = RequestMethod.GET)
    String queryUserInfo(@RequestParam String userId);

}

web/FeignController.java | 使用接口提供服务 From Feign

java 复制代码
@RestController
public class FeignController {

    @Resource
    private FeignService ribbonService;

    @RequestMapping(path = "/api/queryUserInfo", method = RequestMethod.GET)
    public String queryUserInfo(@RequestParam String userId) {
        return ribbonService.queryUserInfo(userId) + " From Feign";
    }

}
 

FeignApplication.java | 注解@EnableEurekaClient、@EnableFeignClients、@EnableDiscoveryClient获取调用注册中心服务

java 复制代码
@SpringBootApplication
@EnableEurekaClient
@EnableDiscoveryClient
@EnableFeignClients
public class FeignApplication {

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

}

application.yml | eureka服务配置,从注册中心获取可用服务

yaml 复制代码
server:
  port: 9001

spring:
  application:
    name: demo-springcloud-feign

eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:7397/eureka/

Ribbon服务调用方

Ribbon是一个基于 HTTP 和 TCP 的客户端负载均衡器。它可以通过在客户端中配置 ribbonServerList 来设置服务端列表去轮询访问以达到均衡负载的作用。

当 Ribbon 与 Eureka 联合使用时,ribbonServerList 会被 DiscoveryEnabledNIWSServerList 重写,扩展成从 Eureka 注册中心中获取服务实例列表。同时它也会用 NIWSDiscoveryPing 来取代 IPing,它将职责委托给 Eureka 来确定服务端是否已经启动。

service/RibbonService.java | 接口式硬编码调用不太易于维护,因此也是比较少用的方式

java 复制代码
@Service
public class RibbonService {

    @Autowired
    private RestTemplate restTemplate;

    public String queryUserInfo(String userId) {
        return restTemplate.getForObject("http://DEMO-SPRINGCLOUD-EUREKA-CLIENT/api/queryUserInfo?userId=" + userId, String.class);
    }

}

web/RibbonController.java | 使用接口提供服务 From Ribbon

java 复制代码
@RestController
public class RibbonController {

    @Resource
    private RibbonService ribbonService;

    @RequestMapping(path = "/api/queryUserInfo", method = RequestMethod.GET)
    public String queryUserInfo(@RequestParam String userId) {
        return ribbonService.queryUserInfo(userId) + " From Ribbon";
    }
    
}

RibbonApplication.java | 通过注解@LoadBalanced注册rest模版,用于Ribbon接口调用

java 复制代码
@SpringBootApplication
@EnableEurekaClient
@EnableDiscoveryClient
public class RibbonApplication {

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

    @Bean
    @LoadBalanced
    RestTemplate restTemplate() {
        return new RestTemplate();
    }

}
 

application.yml | eureka服务配置,从注册中心获取可用服务

yaml 复制代码
server:
  port: 9002

spring:
  application:
    name: demo-springcloud-ribbon

eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:7397/eureka/

测试验证

1:启动服务注册中心demo-springcloud-eureka-server

2:分别启动demo-springcloud-eureka-client,修改端口8001、8002启动两次提供两个服务

3:启动demo-springcloud-feign

4:启动demo-springcloud-ribbon

5:访问服务注册中心http://localhost:7397/

访问服务提供方;http://localhost:8001/api/queryUserInfo?userId=111 | 说明服务正常

访问Feign服务调用放,每次刷新会看到负载均衡调用到不同端口服务:http://localhost:9001/api/queryUserInfo?userId=111

访问Ribbon服务调用放,每次刷新会看到负载均衡调用到不同端口服务:http://localhost:9002/api/queryUserInfo?userId=111

总结

1:在使用SpringCloud时我们可以很轻松的使用到注册中心与很简单的方式去做服务调用

2:以上负载均衡,都是以轮询访问的方式实现的,实际开发过程中还会有一些依赖于机器性能、GC、调用量、响应时间等计算的权重值来做负载IRule

3:服务注册中心,负责维护注册的服务列表,同其他服务注册中心一样,支持高可用配置

4:服务提供方,作为一个 Eureka Client,向 Eureka Server 做服务注册、续约和下线等操作,注册的主要数据包括服务名、机器 ip、端口号、域名等

5:服务消费方,作为一个 Eureka Client,向 Eureka Server 获取 Service Provider 的注册信息,并通过远程调用与 Service Provider 进行通信。

好了到这里就结束了springcloud之服务提供与负载均衡调用 Eureka的学习,大家一定要跟着动手操作起来。需要源码的 可si我获取;

相关推荐
残花月伴6 小时前
springCloud/Alibaba常用中间件之Seata分布式事务
分布式·spring cloud·中间件
zy happy13 小时前
搭建运行若依微服务版本ruoyi-cloud最新教程
java·spring boot·spring cloud·微服务·ruoyi
九章云极AladdinEdu14 小时前
GPU与NPU异构计算任务划分算法研究:基于强化学习的Transformer负载均衡实践
java·开发语言·人工智能·深度学习·测试工具·负载均衡·transformer
佩奇的技术笔记14 小时前
Java学习手册:客户端负载均衡
java·负载均衡
IT成长史18 小时前
deepseek梳理java高级开发工程师微服务面试题-进阶版
java·spring cloud·微服务
紫璨月19 小时前
Feign异步模式丢失上下文问题
spring cloud·openfeign
梦在深巷、19 小时前
nginx配置之负载均衡
运维·nginx·负载均衡
slam小白白白1 天前
轨迹误差评估完整流程总结(使用 evo 工具)
eureka
孤的心了不冷1 天前
【Docker】CentOS 8.2 安装Docker教程
linux·运维·docker·容器·eureka·centos
Volunteer Technology1 天前
SpringCloud Gateway知识点整理和全局过滤器实现
spring·spring cloud·gateway