开发者社区> 问答> 正文

注册到了nacos的服务,怎么才能(利用了ribbon+resttem)只访问相同命名空间下的服务

注册到了nacos的服务,怎么才能(利用了ribbon+spring的resttemplate(传入的serverId/serverName))只访问相同命名空间下的服务,不能进行越权跨命名空间调用。

展开
收起
mahexiansheng 2021-10-28 16:07:57 470 0
6 条回答
写回答
取消 提交回答
  • 十分耕耘,一定会有一分收获!

    楼主你好,看了你的描述,要限制访问相同命名空间下的服务,可以在服务提供者和服务消费者中都添加nacos-discovery的依赖,然后在配置文件中配置所在的命名空间。具体的操作步骤:

    先在服务提供者中添加nacos-discovery的依赖,比如:
    image.png

    在服务提供者的配置文件中,配置所在的命名空间,比如:

    spring.cloud.nacos.discovery.namespace=xxx
    

    然后在服务消费者中添加nacos-discovery的依赖,比如:
    image.png

    接着在服务消费者的配置文件中,配置所在的命名空间,如:

    spring.cloud.nacos.discovery.namespace=xxx
    

    最后,使用Ribbon和RestTemplate进行服务调用时,传入的serverId或serverName应该加上命名空间的前缀,如:

    http://xxx-provider/service/hello
    

    通过以上的操作步骤,就可以将服务调用限制在相同命名空间下了,无法进行跨命名空间的调用。

    2023-12-04 01:46:19
    赞同 展开评论 打赏
  • 当您使用Ribbon + RestTemplate来访问Nacos中的服务时,只需要将 Ribbon 的负载均衡策略配置为 NacosRule 即可只访问相同命名空间下的服务。
    以下是具体步骤:

    1. 配置 Ribbon 的负载均衡策略
    @Bean
    public IRule ribbonRule() {
        return new NacosRule();
    }
    
    1. 将 Ribbon 的负载均衡策略应用到 RestTemplate 中
    @Autowired
    private RestTemplate restTemplate;
    
    @Autowired
    @Qualifier("ribbonRule")
    private IRule ribbonRule;
    
    @Bean
    public LoadBalancerClient loadBalancerClient() {
        return new RibbonLoadBalancerClient(ribbonRule);
    }
    
    @Bean
    public ServiceInstanceChooser serviceInstanceChooser(RestTemplate restTemplate) {
        return new DefaultServiceInstanceChooser(restTemplate);
    }
    
    1. 使用 RestTemplate 进行服务调用
    List<ServiceInstance> instances = loadBalancerClient.choose(serviceId);
    if (instances != null && !instances.isEmpty()) {
        ServiceInstance instance = instances.get(0);
        String url = "http://" + instance.getHost() + ":" + instance.getPort() + "/path";
        // 使用 RestTemplate 发送请求
    }
    
    1. 确保在服务注册时使用相同的命名空间

    以上代码将使 Ribbon 只选择同一个命名空间中的服务。如果要更改 Ribbon 所使用的命名空间,请在 serviceId 参数中指定不同的命名空间。

    2023-11-29 19:18:57
    赞同 展开评论 打赏
  • 为了避免Spring Cloud Ribbon跨越命名空间调用Nacos上的服务,请确保您的服务注册表中的服务都位于同一个命名空间内,并且服务消费者配置的serviceId、serverId和serverName要与服务提供者保持一致。可以添加以下代码片段,防止服务跨越命名空间调用:

    1. 在服务提供者端添加配置:
    spring.cloud.nacos.discovery.namespace=default # 命名空间 ID
    
    1. 在服务消费者端添加配置:
    ribbon.NFLoadBalancerRuleClassName=com.netflix.loadbalancer.ZoneAffinityRule # 确保服务只会调用同一区域内的服务
    

    这些配置将确保您的服务仅在同一名称空间内调用,并避免跨越命名空间调用。如果需要跨越命名空间调用,请将"spring.cloud.nacos.discovery.namespace"设置为您想使用的命名空间ID。
    一旦设置了这些配置,所有服务都需要在同一名称空间内发布,并且要正确地设置服务ID和服务名称,确保它们唯一且正确。

    2023-11-28 11:53:03
    赞同 展开评论 打赏
  • 天下风云出我辈,一入江湖岁月催,皇图霸业谈笑中,不胜人生一场醉。

    需要在Nacos中为每个命名空间创建一个Ribbon客户端,并将其绑定到您的服务上。这可以通过在您的服务代码中使用Nacos的绑定器来完成。绑定器可以将服务的唯一标识符映射到Ribbon客户端。这样,当客户端尝试访问服务时,Ribbon客户端会将请求路由到相应的命名空间。
    需要在Spring配置文件中设置Ribbon的排他性,以确保客户端只能访问相同命名空间下的服务。您可以通过在Spring配置文件中配置一个@Qualifier注解来实现这一点。例如,如果您的服务有两个命名空间testNamespace和otherNamespace,并且您想将请求路由到testNamespace下的服务,您可以使用以下代码:
    image.png

    在上面的代码中,我们使用了@Qualifier注解来引用两个命名空间的Ribbon客户端。如果客户端是testNamespaceClient,则会返回Hello, anonymous (testNamespace/127.0.0.1:8848);如果客户端是otherNamespaceClient,则会返回Hello, anonymous (otherNamespace/127.0.0.1:8848);否则,如果两个客户端都没有指定,则会返回Hello, anonymous (testNamespace/127.0.0.1:8848)。
    您需要确保在使用Ribbon时,您的服务端口是私有的,并且只有在Nacos中绑定了Ribbon客户端的服务才能被访问。这可以通过在Nacos的安全配置中设置访问权限来实现。

    2023-11-27 16:50:47
    赞同 展开评论 打赏
  • 在 Nacos 中,每个服务都有一个命名空间的概念,用于隔离不同的服务。要只访问相同命名空间下的服务,你需要进行以下步骤:

    在 Nacos 中,为每个服务分配一个命名空间。命名空间的名称可以是任何字符串,通常用于区分不同的服务或应用程序。
    在服务的注册信息中,将命名空间信息添加到服务元数据中。这可以通过在服务注册时传递命名空间信息来实现。具体的实现方式取决于你使用的 Nacos 客户端库和编程语言。
    在客户端应用程序中,使用 RestTemplate 来调用远程服务。在调用服务时,你需要将命名空间信息作为参数传递给 RestTemplate。
    在 RestTemplate 的配置中,使用 Nacos 客户端库提供的负载均衡策略。这样,当调用服务时,RestTemplate 将根据命名空间信息来选择要调用的服务实例。
    确保客户端应用程序具有正确的权限来访问目标命名空间下的服务。如果需要身份验证和授权,请在 Nacos 中配置相应的策略。
    通过以上步骤,你可以限制客户端应用程序只能访问相同命名空间下的服务,而不能进行越权跨命名空间调用。

    2023-11-27 16:47:25
    赞同 展开评论 打赏
  • 北京阿里云ACE会长

    要实现只访问相同命名空间下的服务,可以通过以下步骤:

    1. 在Nacos上配置服务分组。在Nacos的服务中心页面,为你的服务添加一个命名空间,并将需要限制访问的服务添加到该命名空间下。
    2. 在Ribbon中配置服务分组。在Ribbon的配置文件中(如:application.yml或application.properties),添加以下配置:

    ribbon:
    my-service-group:
    listOfServers: http://localhost:8080/my-service-group
    CopyCopy

    这里的my-service-group是你在Nacos上创建的服务分组名称,http://localhost:8080/my-service-group是该分组下的所有服务的地址。

    1. 在Spring中配置Ribbon。在你的Spring Boot应用中,添加以下配置:

    @Configuration
    public class MyConfiguration {
    @Bean
    public RestTemplate restTemplate() {
    return new RestTemplate();
    }
    @Bean
    public IRibbonClient ribbonClient(RestTemplate restTemplate) {
    DefaultRibbonClient ribbonClient = new DefaultRibbonClient(restTemplate);
    ribbonClient.setServerListUpdateInterval(1000); // 设置服务地址更新间隔,单位:毫秒
    return ribbonClient;
    }
    }
    CopyCopy

    1. 在需要调用服务的类中,注入IRibbonClient并使用getForObject()方法调用服务。例如:

    @Service
    public class MyService {
    @Autowired
    private IRibbonClient ribbonClient;
    public String callMyService(String serverId) {
    String url = "http://my-service-group/my-service/" + serverId;
    return ribbonClient.getForObject(url, String.class);
    }
    }

    2023-11-25 08:50:07
    赞同 展开评论 打赏
滑动查看更多
问答排行榜
最热
最新

相关电子书

更多
Nacos架构&原理 立即下载
workshop专场-微服务专场-开发者动手实践营-微服务-使用Nacos进行服务的动态发现和流量调度 立即下载
Nacos 启航,发布第一个版本, 云原生时代助力用户微服务平台建设 立即下载