ip route get ip地址 应用案例

应用场景

    在做虚拟化实验用的虚拟机和实际的ECS云主机一般都会有多个网卡,网络的联通性是经常碰到的问题。比如在一个VM上有3个网卡,分别为ens160(和寄主机进行桥接的网卡10.0.0.128)、ens224(连接仅主机网络10.0.0.0/24的网卡10.0.0.128)和docker0(容器化平台的虚拟网卡)。当我想知道连接Internet网络的路由是经过那个网卡时,我们可以用ip route get ip地址来实现。

ip route get ip地址的使用

当我要获得连接qq.com的路由路径时,操作步骤如下:

STEP:ping -c1 qq.com   

通过ping 1次qq.com获得qq.com域名的ip地址,因为ip route 需要的是ip地址。

[root@localhost system-connections]# ping -c1 qq.com
PING qq.com (61.129.7.47) 56(84) bytes of data.
64 bytes from 61.129.7.47 (61.129.7.47): icmp_seq=1 ttl=128 time=35.7 ms

--- qq.com ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 35.685/35.685/35.685/0.000 ms

STEP:ip route get 61.129.7.47

[root@localhost system-connections]# ip route get 61.129.7.47
61.129.7.47 via 192.168.1.2 dev ens160 src 192.168.1.128 uid 0 
    cache 

STEP:ip route get IP地址返回数据的解释

当你运行 ip route get 61.129.7.47 命令时,它会返回与目标IP地址 61.129.7.47 相关的路由信息。以下是可能的返回值及其解释:

  • 如果返回 61.129.7.47 dev <网络接口> src <源IP地址>,这意味着目标IP地址是直接连接到指定的网络接口上,并且源IP地址是指定的源IP地址。
  • 如果返回 unreachable,这意味着目标IP地址是不可达的,无法通过任何已知的路由路径到达。
  • 如果返回 local <目标IP地址> dev lo src <源IP地址>,这意味着目标IP地址是本地主机的IP地址,通过本地回环接口 (lo) 可以直接访问。
  • 如果返回 broadcast <目标IP地址> dev <网络接口> src <源IP地址>,这意味着目标IP地址是一个广播地址,可以通过指定的网络接口进行广播。
  • 如果返回 blackhole,这意味着目标IP地址是黑洞路由,所有传入的数据包都会被丢弃。
  • 如果返回 prohibit,这意味着目标IP地址是禁止路由,所有传入的数据包都会被拒绝。
  • 如果返回 nat <目标IP地址> via <下一跳> dev <网络接口> src <源IP地址>,这意味着目标IP地址需要通过网络地址转换 (NAT) 来访问,通过指定的下一跳和网络接口进行转发。
  • 如果返回 via <下一跳> dev <网络接口> src <源IP地址>这意味着目标IP地址需要通过指定的下一跳和网络接口进行转发

这些是一些常见的返回值和对应的解释,实际返回值可能会有所不同,具体取决于你的网络配置和路由表设置。

虚拟机所在寄主机的“虚拟网络”设置和“虚拟网关”设置图示

在Spring Cloud Gateway中,可以通过配置Route来将请求路由到对应的服务上。在配置Route时,可以使用Eureka中的服务名作为目标服务的标识符,但是需要注意的是,Eureka中的服务名只是一个逻辑名字,并不是具体的IP地址和端口号。 如果要从Eureka中动态获取目标IP地址和端口信息,可以使用Spring Cloud的DiscoveryClient来获取服务的实例信息。在获取到实例信息后,可以通过Feign的@FeignClient注解配置URL,从而实现对目标服务的调用。具体的步骤如下: 1. 引入Spring Cloud Eureka和Feign的依赖: ```xml <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency> ``` 2. 在Spring Cloud Gateway中配置Route,使用服务名作为目标服务的标识符: ```yaml spring: cloud: gateway: routes: - id: service-a-route uri: lb://service-a predicates: - Path=/service-a/** ``` 3. 在Feign的@FeignClient注解中配置URL,使用DiscoveryClient获取服务实例信息并构造URL: ```java @FeignClient(name = "service-a", url = "${service-a.url}") public interface ServiceAClient { // ... } @Configuration public class ServiceAConfiguration { private final DiscoveryClient discoveryClient; public ServiceAConfiguration(DiscoveryClient discoveryClient) { this.discoveryClient = discoveryClient; } @Bean public ServiceInstanceListSupplier serviceInstanceListSupplier() { return ServiceInstanceListSupplier.builder() .withDiscoveryClient(discoveryClient) .withServiceName("service-a") .build(); } @Bean public IRule ribbonRule() { return new WeightedResponseTimeRule(); } @Bean @ConditionalOnMissingBean public RestClient restClient(RibbonClientFactory ribbonClientFactory) { return new RibbonRestClient(ribbonClientFactory); } @Bean @ConditionalOnMissingBean public RibbonLoadBalancerContext ribbonLoadBalancerContext(SpringClientFactory clientFactory) { return clientFactory.getLoadBalancerContext("default"); } @Bean @ConditionalOnMissingBean public SpringClientFactory clientFactory() { return new SpringClientFactory(); } @Bean public LoadBalancerProperties loadBalancerProperties() { return new LoadBalancerProperties(); } @Bean public Request.Options options() { return new Request.Options(5000, 5000); } @Bean public Logger.Level feignLoggerLevel() { return Logger.Level.FULL; } @Bean public Decoder decoder() { return new JacksonDecoder(); } @Bean public Encoder encoder() { return new JacksonEncoder(); } @Bean public Retryer retryer() { return new Retryer.Default(); } @Bean public Contract contract() { return new SpringMvcContract(); } @Value("${service-a.port}") private Integer port; @Value("${service-a.context-path}") private String contextPath; @Bean public String serviceAUrl() { ServiceInstance instance = discoveryClient.getInstances("service-a").get(0); String host = instance.getHost(); String url = String.format("http://%s:%d/%s", host, port, contextPath); return url; } } ``` 在上述代码中,我们首先通过DiscoveryClient获取服务实例信息,然后根据实例信息构造URL,并将URL注入到Feign的@FeignClient注解中。需要注意的是,在配置Feign的时候,需要手动构造一些Bean,例如ServiceInstanceListSupplier、IRule等,以便让Feign能够正确地调用目标服务。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值