当前位置: 首页> 教育> 就业 > 定制开发网站的公司_深圳网站建设制作网络公司_郑州网络营销公司哪个好_信息流广告优秀案例

定制开发网站的公司_深圳网站建设制作网络公司_郑州网络营销公司哪个好_信息流广告优秀案例

时间:2025/7/13 12:08:21来源:https://blog.csdn.net/C18298182575/article/details/144779548 浏览次数:0次
定制开发网站的公司_深圳网站建设制作网络公司_郑州网络营销公司哪个好_信息流广告优秀案例

Dubbo

dubbo怎么定位的,在微服务中扮演什么角色,与Eureka区别

dubbo远程调用原理

动态代理

功能:服务治理(服务注册与发现,远程调用,熔断+重试,负载均衡(轮询/随机/权重/活跃度))

 

Dobbuo实现服务注册与发现有借助其他组件吗,还是他自己实现的

 

Dubbo 在实现 服务注册与发现 时,既有自己实现的部分,也可以通过借助外部组件(注册中心)来完成。实际上,Dubbo 主要依赖外部的 注册中心 来进行服务的注册与发现。服务注册与发现的过程是 Dubbo 分布式架构中关键的一部分,帮助实现服务的高可用和负载均衡。

1. Dubbo 自己的实现

Dubbo 的早期版本(特别是在 2.x 之前),曾经内置了一些简单的服务注册与发现机制,但这些机制比较原始、简单,且功能有限。因此,Dubbo 并不依赖自己完整的服务注册与发现实现,而是希望将这部分职责交给更强大的分布式注册中心。

2. 依赖外部组件:服务注册与发现

Dubbo 2.x 开始,Dubbo 默认使用外部的服务注册中心来完成服务的注册与发现。常见的外部组件有:

  • Zookeeper:这是 Dubbo 默认支持的服务注册与发现组件。Dubbo 利用 Zookeeper 提供的分布式协调功能,来进行服务注册、发现和监控。
  • Nacos:在 Dubbo 2.7 版本及以后,Dubbo 也支持 Nacos 作为注册中心。Nacos 提供了更丰富的功能,如动态配置管理、服务治理等。

此外,Dubbo 还支持其他一些注册中心的插件,如 ConsulEtcd 等。

3. 服务注册与发现过程

  • 服务注册

    • 服务提供者启动时,会将自己的服务信息(如服务接口、服务实现类、IP、端口等)注册到注册中心(如 Zookeeper 或 Nacos)。
    • 这些信息通常是 以树形结构存储,注册中心会为每个服务暴露一个唯一的路径,表示该服务的实例信息。
  • 服务发现

    • 服务消费者在调用服务之前,会查询注册中心,获取可用的服务提供者信息(如服务的 IP 地址、端口、负载均衡策略等)。
    • 注册中心根据客户端的请求返回可用的服务实例,消费者可以通过这些信息调用相应的服务。

4. 为什么选择外部注册中心

Dubbo 使用外部注册中心来实现服务注册与发现,主要有以下几个原因:

  • 高可用与容错性:外部注册中心如 Zookeeper、Nacos 提供了高可用和容错机制,能够处理服务实例的动态变化(如上线、下线、网络故障等)。
  • 分布式环境支持:注册中心为 Dubbo 提供了强大的分布式协调能力,尤其是在大规模分布式系统中,注册中心能够管理成千上万的服务实例,并确保服务发现的可靠性。
  • 负载均衡和容错:通过服务注册中心,Dubbo 可以实现更加灵活和智能的负载均衡和故障转移机制,避免直接在服务之间做硬编码。
  • 多种协议支持:注册中心可以同时支持不同类型的服务(如 Dubbo 服务、HTTP 服务等),使得 Dubbo 在多协议场景下的兼容性更强。

5. 服务注册与发现的流程

服务注册流程
  1. 服务提供者启动:服务提供者启动时,Dubbo 会将服务接口、服务实现、IP、端口等信息通过配置文件或注解的方式传递给注册中心。
  2. 注册中心保存信息:注册中心(如 Zookeeper)会在特定的节点路径下存储服务的信息,确保该服务的可用性。
  3. 服务提供者心跳:为了保证服务的健康状态,服务提供者定期向注册中心发送心跳,确保自己在注册中心的信息是有效的。
服务发现流程
  1. 服务消费者查询:服务消费者启动时,会查询注册中心,获取指定服务的地址和信息。
  2. 注册中心返回服务实例信息:注册中心返回可用的服务实例(如服务提供者的 IP、端口等)。
  3. 调用远程服务:服务消费者通过网络请求(如 HTTP、Dubbo 协议等)调用远程服务。

6. Dubbo与Zookeeper/Nacos的集成

  • Zookeeper 集成

    • Zookeeper 作为一个分布式协调框架,提供了类似分布式文件系统的机制,Dubbo 使用 Zookeeper 进行服务注册和发现。
    • 服务提供者将服务信息注册到 Zookeeper 的某个节点,而消费者则从 Zookeeper 查询该节点,获得可用服务的列表。
    • Zookeeper 支持数据一致性和分布式事务,能够高效地管理服务的动态变化。
  • Nacos 集成

    • Nacos 是阿里巴巴开源的动态服务发现与配置管理平台,提供了类似 Zookeeper 的服务注册与发现功能。
    • 与 Zookeeper 相比,Nacos 在用户体验、配置管理、健康检查等方面更加灵活、简便。
    • Nacos 支持服务的 动态注册与发现,并且可以实现更加细粒度的服务管理。

7. 总结

  • Dubbo 本身并没有完全实现服务注册与发现,而是将这一功能交给外部的注册中心(如 ZookeeperNacos 等)来处理。
  • 通过注册中心,Dubbo 实现了服务的动态注册与发现,能够支持分布式架构中的服务高可用、负载均衡和容错等重要功能。
  • 使用外部注册中心的好处包括高可用性、灵活的服务治理、分布式协调能力等。

因此,Dubbo 并不依赖自己实现服务注册与发现,而是借助成熟的注册中心组件来完成这些任务。

限流 

 网关

安全性 ,如黑名单

Nacos

nacos实现远程调用方案

Nacos 是一个开源的 服务发现配置管理 平台,常用于微服务架构中的服务注册与发现以及配置管理。它本身并不直接提供远程调用(如 Dubbo 或 gRPC 提供的服务调用),但可以与其他远程调用框架结合使用,在微服务架构中实现服务间的远程调用。

下面我将详细介绍如何通过 Nacos + Spring CloudNacos + Dubbo 实现远程调用。


1. Nacos + Spring Cloud 实现远程调用

在 Spring Cloud 微服务架构中,Nacos 通常作为服务注册与发现的中心,服务间的远程调用通过 Spring Cloud FeignSpring Cloud RestTemplate 来实现。

步骤:
  1. 服务注册与发现

    • 各个微服务注册到 Nacos。
    • Nacos 充当服务注册中心,提供服务发现功能。
  2. 服务提供者

    • 在 Spring Boot 服务中使用 @EnableDiscoveryClient 注解开启服务发现。
    • 使用 @RestController 或 @Service 暴露远程调用接口。
  3. 服务消费者

    • 服务消费者同样需要启用 @EnableDiscoveryClient 来从 Nacos 获取服务列表。
    • 可以使用 Feign Client 或 RestTemplate 来调用其他微服务。
示例:Nacos + Spring Cloud + Feign + 远程调用

服务提供者

// Application.java
@SpringBootApplication
@EnableDiscoveryClient
public class ServiceProviderApplication {public static void main(String[] args) {SpringApplication.run(ServiceProviderApplication.class, args);}
}// Controller.java
@RestController
@RequestMapping("/hello")
public class HelloController {@GetMapping("/greet")public String greet() {return "Hello from Service Provider!";}
}

服务消费者

// Application.java
@SpringBootApplication
@EnableDiscoveryClient
public class ServiceConsumerApplication {public static void main(String[] args) {SpringApplication.run(ServiceConsumerApplication.class, args);}
}// Feign 客户端接口
@FeignClient(name = "service-provider")
public interface HelloClient {@GetMapping("/hello/greet")String greet();
}// 服务消费者调用
@RestController
@RequestMapping("/consumer")
public class ConsumerController {@Autowiredprivate HelloClient helloClient;@GetMapping("/call")public String callService() {return helloClient.greet();}
}

application.properties 配置文件:

 

spring.application.name=service-consumer spring.cloud.nacos.discovery.server-addr=localhost:8848 spring.application.name=service-provider spring.cloud.nacos.discovery.server-addr=localhost:8848

解释:
  1. @EnableDiscoveryClient:在服务提供者和消费者中启用服务发现功能,使得它们能够与 Nacos 进行交互。
  2. @FeignClient(name = "service-provider"):Feign 用于通过服务名称调用服务,Feign 会自动处理服务发现与调用。
  3. spring.cloud.nacos.discovery.server-addr=localhost:8848:配置 Nacos 注册中心的地址。
Feign 优势:
  • 简洁:Feign 是声明式的 HTTP 客户端,服务间调用只需要通过接口进行,不需要关心底层的 HTTP 请求细节。
  • 负载均衡:Spring Cloud 提供的 Feign 支持客户端负载均衡,可以自动通过 Ribbon 来实现负载均衡。

2. Nacos + Dubbo 实现远程调用

Dubbo 是一个高性能的 RPC 框架,适用于服务间的远程调用。Nacos 可以与 Dubbo 集成,作为服务注册与发现的中心,Dubbo 用于处理具体的远程调用过程。

步骤:
  1. 服务注册与发现

    • Dubbo 服务在启动时将自身注册到 Nacos。
    • Dubbo 服务消费者通过 Nacos 查找服务提供者。
  2. 服务提供者

    • 在 Dubbo 服务中,通过 Nacos 作为注册中心进行服务注册。
  3. 服务消费者

    • 服务消费者通过 Dubbo 与 Nacos 进行集成,进行服务的发现和远程调用。
示例:Nacos + Dubbo + 远程调用

服务提供者

// Application.java
@SpringBootApplication
public class ServiceProviderApplication {public static void main(String[] args) {SpringApplication.run(ServiceProviderApplication.class, args);}
}// 服务接口
public interface HelloService {String sayHello();
}// 服务实现
@Service
public class HelloServiceImpl implements HelloService {@Overridepublic String sayHello() {return "Hello from Dubbo Service Provider!";}
}

服务消费者

// Application.java
@SpringBootApplication
public class ServiceConsumerApplication {public static void main(String[] args) {SpringApplication.run(ServiceConsumerApplication.class, args);}
}// 服务消费者调用
@DubboReference
private HelloService helloService;@GetMapping("/call")
public String callService() {return helloService.sayHello();
}

application.properties 配置文件:

 

# Nacos 配置 spring.cloud.nacos.discovery.server-addr=localhost:8848 spring.dubbo.registry.address=nacos://localhost:8848 spring.dubbo.application.name=service-consumer spring.dubbo.registry.id=nacos

解释:
  1. spring.dubbo.registry.address=nacos://localhost:8848:配置 Dubbo 的注册中心为 Nacos。
  2. @DubboReference:注解用于注入 Dubbo 服务接口,自动从 Nacos 获取服务提供者并执行远程调用。

3. Nacos 配置管理与远程调用

除了服务注册与发现,Nacos 还可以作为配置中心来管理远程调用中的配置。你可以通过 Nacos 动态加载服务的配置,从而在运行时调整服务间的调用方式、负载均衡策略等。

配置管理:
  1. 动态配置:通过 Nacos 提供的配置管理功能,可以动态调整服务间调用的配置。例如,负载均衡策略、调用超时时间等都可以通过 Nacos 配置中心进行管理。
  2. 环境隔离:Nacos 可以支持多环境配置,如开发、测试、生产环境的隔离,确保不同环境下的远程调用使用不同的配置。

总结

  1. Nacos + Spring Cloud

    • 利用 Nacos 作为服务注册与发现中心,服务消费者通过 Feign 或 RestTemplate 调用服务提供者。
    • Feign 简单易用,支持负载均衡和容错,适合大部分微服务架构中的服务调用。
  2. Nacos + Dubbo

    • 结合 Nacos 和 Dubbo,实现高性能的远程调用。
    • Dubbo 提供了丰富的远程调用功能,支持 RPC 通信、服务治理、负载均衡、容错等特性。
  3. Nacos 配置中心

    • Nacos 可以为远程调用提供配置管理功能,支持动态调整服务的行为(如负载均衡策略、超时设置等)。

通过这些集成方案,你可以利用 Nacos 作为中心来实现服务注册、发现、配置管理,并通过 Feign 或 Dubbo 进行高效的远程服务调用。

Feign与RestTemplate

在 Spring Cloud 微服务架构中,Nacos 通常作为服务注册与发现的中心,服务间的远程调用通过 Spring Cloud Feign 或 Spring Cloud RestTemplate 来实现。 二者区别是什么,代码举例说明 

在 Spring Cloud 微服务架构中,Nacos 作为服务注册与发现的中心,Spring Cloud Feign 和 Spring Cloud RestTemplate 都可以用于实现服务间的远程调用,但它们有一些显著的区别。

1. Spring Cloud Feign

Feign 是一个声明式的 HTTP 客户端,可以通过接口方式来定义远程调用,Feign 会自动为你实现 HTTP 请求的细节。它结合了 Spring Cloud 的负载均衡(Ribbon)和服务发现(Eureka/Nacos),使得服务间调用变得非常简洁。

特点:
  • 声明式调用:通过接口方式定义远程调用,代码简洁。
  • 与 Spring Cloud 结合紧密:集成了负载均衡、服务发现、熔断等功能。
  • 自动处理 HTTP 请求:不需要手动编写 HTTP 请求的相关代码。
示例代码:

假设有一个用户服务(user-service)和一个订单服务(order-service)。

1. 添加依赖:pom.xml 中加入 Feign 和 Nacos 的相关依赖:

<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

2. 启用 Feign 客户端: 在 Spring Boot 启动类中启用 Feign 客户端:

@SpringBootApplication
@EnableFeignClients
public class OrderServiceApplication {public static void main(String[] args) {SpringApplication.run(OrderServiceApplication.class, args);}
}

3. 定义 Feign 接口:

@FeignClient(name = "user-service")  // user-service 是 Nacos 中注册的服务名称
public interface UserClient {@GetMapping("/user/{id}")User getUserById(@PathVariable("id") Long id);
}

4. 使用 Feign 调用远程服务:

@RestController
@RequestMapping("/orders")
public class OrderController {@Autowiredprivate UserClient userClient;@GetMapping("/{orderId}")public String getOrderDetails(@PathVariable Long orderId) {User user = userClient.getUserById(123L);  // 调用 user-service 服务return "Order for user: " + user.getName();}
}

2. Spring Cloud RestTemplate

RestTemplate 是 Spring 提供的一个同步 HTTP 客户端,用于发起 HTTP 请求。在 Spring Cloud 中,它通常与 Ribbon 和 Nacos 结合使用,用于实现服务间的调用,但相较于 Feign,RestTemplate 更加低级,需要手动配置 URL 和请求。

特点:
  • 程序员控制更多细节:需要手动编写 URL 和处理请求。
  • 灵活性高:可以更加灵活地控制 HTTP 请求的细节。
  • 不如 Feign 简洁:相对于 Feign 需要更多的样板代码。
示例代码:

假设同样有 user-serviceorder-service

1. 添加依赖:pom.xml 中加入 RestTemplate 和 Nacos 的相关依赖:

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

2. 定义 RestTemplate Bean:

@Configuration
public class RestTemplateConfig {@Beanpublic RestTemplate restTemplate() {return new RestTemplate();}
}

项目实战

Resttemplate配置
 

remote.maxTotalConnect=200
remote.maxConnectPerRoute=100
remote.connectTimeout=50000
remote.readTimeout=50000
package com.smcv.mall.tasks.configure;import org.apache.http.client.HttpClient;
import org.apache.http.impl.client.HttpClientBuilder;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.http.client.BufferingClientHttpRequestFactory;
import org.springframework.http.client.ClientHttpRequestFactory;
import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
import org.springframework.http.client.SimpleClientHttpRequestFactory;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.StringHttpMessageConverter;
import org.springframework.web.client.RestTemplate;import java.nio.charset.StandardCharsets;
import java.util.List;/*** @Author: shenjian* @Desription:* @Date: Created in 下午3:37 2017/11/24* @Modified By:*/
@Configuration
@EnableCaching
@ConditionalOnClass(value = {RestTemplate.class, HttpClient.class})
@RefreshScope
public class RestTemplateConfiguration {@Value("${remote.maxTotalConnect}")private int maxTotalConnect; //连接池的最大连接数默认为0@Value("${remote.maxConnectPerRoute}")private int maxConnectPerRoute; //单个主机的最大连接数@Value("${remote.connectTimeout}")private int connectTimeout; //连接超时默认2s@Value("${remote.readTimeout}")private int readTimeout; //读取超时默认30s//创建HTTP客户端工厂private ClientHttpRequestFactory createFactory() {if (this.maxTotalConnect <= 0) {SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory();factory.setConnectTimeout(this.connectTimeout);factory.setReadTimeout(this.readTimeout);return factory;}HttpClient httpClient = HttpClientBuilder.create().setMaxConnTotal(this.maxTotalConnect).setMaxConnPerRoute(this.maxConnectPerRoute).build();HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory(httpClient);factory.setConnectTimeout(this.connectTimeout);factory.setReadTimeout(this.readTimeout);return factory;}@Bean("getByBodyRestTemplate")@Primarypublic RestTemplate restTemplate() {RestTemplate restTemplate = new RestTemplate(new BufferingClientHttpRequestFactory(this.createFactory()));restTemplate.setRequestFactory(new HttpComponentsClientRestfulHttpRequestFactory());List<HttpMessageConverter<?>> converterList =  restTemplate.getMessageConverters();// 重新设置StringHttpMessageConverter字符集为UTF-8,解决中文乱码问题HttpMessageConverter<?> converterTarget = null;int index = 0;for (HttpMessageConverter<?> item : converterList) {if (StringHttpMessageConverter.class == item.getClass()) {converterTarget = item;break;}++index;}if (null != converterTarget) {converterList.remove(converterTarget);}converterList.add(index, new StringHttpMessageConverter(StandardCharsets.UTF_8));// 加入日志打印
//        restTemplate.setInterceptors(Collections.singletonList((ClientHttpRequestInterceptor)restTemplateInterceptor));return restTemplate;}}

3. 使用 RestTemplate 调用远程服务:

@RestController
@RequestMapping("/orders")
public class OrderController {@Autowiredprivate RestTemplate restTemplate;@Value("${user.service.url}")private String userServiceUrl;@GetMapping("/{orderId}")public String getOrderDetails(@PathVariable Long orderId) {String userUrl = userServiceUrl + "/user/123";  // 构造 user-service 的 URLResponseEntity<User> response = restTemplate.exchange(userUrl, HttpMethod.GET, null, User.class);User user = response.getBody();return "Order for user: " + user.getName();}
}

application.properties 中配置 user-service 的 URL:

 

user.service.url=http://user-service

3. 两者的主要区别

特性Spring Cloud FeignSpring Cloud RestTemplate
使用方式基于接口定义,声明式调用基于手动 URL 和 HTTP 请求,编程式调用
简洁性更简洁,无需关心请求细节需要手动编写请求细节
集成自动集成负载均衡(Ribbon)、服务发现(Nacos)等手动配置 Ribbon 和服务发现
灵活性较低,主要针对常规的 RESTful 调用高,可以自由处理更多的 HTTP 细节
可维护性高,代码简洁易读低,需要编写更多的样板代码

总结:

  • Feign 适合在微服务架构中需要频繁进行服务间通信时使用,它提供了声明式的 HTTP 调用方式,能够简化代码并与 Spring Cloud 的其他组件(如 Ribbon、Nacos)紧密集成。
  • RestTemplate 提供了更多的灵活性和控制,适合需要精细控制 HTTP 请求的场景,但相对来说代码较为繁琐,且需要手动处理更多的细节。

通常情况下,推荐使用 Feign,因为它更符合微服务的设计理念,简洁且易于维护。

Spring Cloud RestTemplate 手动配置 Ribbon 和服务发现 具体如何实现的

项目中没有看到这个注解 @LoadBalanced // 启用 Ribbon 负载均衡

关键字:定制开发网站的公司_深圳网站建设制作网络公司_郑州网络营销公司哪个好_信息流广告优秀案例

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

责任编辑: