当前位置: 首页 > news >正文

云南营造建设有限公司网站我们不仅仅做网站更懂得网络营销

云南营造建设有限公司网站,我们不仅仅做网站更懂得网络营销,微信手机网站,网站推广与优化怎么做文章目录 一、前置知识1、在Spring Boot中使用Dubbo#xff1f;1#xff09;配置服务提供者2#xff09;配置服务消费者 2、在Spring Boot中使用Eureka#xff1f;1#xff09;Eureka服务2#xff09;Eureka客户端 二、项目代码分析1、dubbo服务提供者1#xff09;启动类… 文章目录 一、前置知识1、在Spring Boot中使用Dubbo1配置服务提供者2配置服务消费者 2、在Spring Boot中使用Eureka1Eureka服务2Eureka客户端 二、项目代码分析1、dubbo服务提供者1启动类2配置类标签过滤器提供者过滤器 2、dubbo服务消费者/Controller1启动类2配置类ConsumerFilterTagRouterFilter 3、Eureka服务端1启动类2配置类 4、Eureka客户端1启动类2配置类 三、总结思考题1、Dubbo可以使用的注册中心2、Dubbo集成使用Eureka和Zookeeper有什么区别3、服务A只注册到EurekaDubbo服务提供者B注册到Zookeeper此时服务A可以调用到B?4、对外提供API访问的服务同时注册到了Eureka和Zookeeper中两个独立注册中心需要同步机制来保证一致性5、对外提供API访问的服务为什么要同时注册到了Eureka和Zookeeper 一、前置知识 1、在Spring Boot中使用Dubbo 需要配置服务提供者和服务消费者 引入Dubbo相关依赖 dependencygroupIdorg.apache.dubbo/groupIdartifactIddubbo-spring-boot-starter/artifactIdversion2.7.8/version /dependency1配置服务提供者 1、在配置文件中配置Dubbo的相关信息 # Dubbo应用名称 dubbo.application.nameforlan-provider # Dubbo注册中心地址 dubbo.registry.addresszookeeper://localhost:2181 # Dubbo服务协议 dubbo.protocol.namedubbo dubbo.protocol.port208802、在服务提供者的启动类上添加EnableDubbo注解 SpringBootApplication EnableDubbo public class ForlanProviderApplication {public static void main(String[] args) {SpringApplication.run(ProviderApplication.class, args);} }3、编写服务提供者的接口和实现类 public interface HelloService {String sayHello(String name); }Service public class HelloServiceImpl implements HelloService {Overridepublic String sayHello(String name) {return Hello, name !;} }2配置服务消费者 1、在配置文件中配置Dubbo的相关信息 # Dubbo应用名称 dubbo.application.nameforlan-consumer # Dubbo注册中心地址 dubbo.registry.addresszookeeper://localhost:2181 # Dubbo服务协议 dubbo.protocol.namedubbo dubbo.protocol.port208802、在服务消费者的启动类上添加EnableDubbo注解 SpringBootApplication EnableDubbo public class ConsumerApplication {public static void main(String[] args) {SpringApplication.run(ConsumerApplication.class, args);} }3、编写服务消费者的代码 RestController public class HelloController {Referenceprivate HelloService helloService;GetMapping(/hello)public String sayHello(RequestParam String name) {return helloService.sayHello(name);} }2、在Spring Boot中使用Eureka 需要配置Eureka服务器和客户端 1Eureka服务 添加Eureka依赖在您的pom.xml文件中添加以下依赖项 dependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-starter-netflix-eureka-server/artifactId /dependency添加配置 什么都不配Eureka服务的默认端口号是8761 配置Eureka服务器在您的Spring Boot应用程序的主类上添加EnableEurekaServer注解以将应用程序标记为Eureka服务器 import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;SpringBootApplication EnableEurekaServer public class EurekaServerApplication {public static void main(String[] args) {SpringApplication.run(EurekaServerApplication.class, args);} }2Eureka客户端 添加以下依赖项 dependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-starter-netflix-eureka-client/artifactId /dependency添加配置 spring.application.nameforlan eureka.client.serviceUrl.defaultZonehttp://localhost:8761/eureka启用Eureka客户端在您的Spring Boot应用程序的主类上添加EnableDiscoveryClient注解以将应用程序标记为Eureka客户端。例如 import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient;SpringBootApplication EnableDiscoveryClient public class ForlanApplication {public static void main(String[] args) {SpringApplication.run(ForlanApplication .class, args);} }完成上述配置后您的Spring Boot应用程序将作为Eureka客户端注册到Eureka服务器并可以通过Eureka服务器进行服务发现和负载均衡。 二、项目代码分析 1、dubbo服务提供者 1启动类 SpringBootApplication EnableDubbo public class ForlanProviderApplication {public static void main(String[] args) {SpringApplication.run(ForlanProviderApplication.class, args);} }2配置类 # Dubbo应用名 dubbo.application.nameforlan-provider # 设置应用日志记录器如Log4j、Logback和Java自带的JULJava Util Logging来记录Dubbo框架的日志信息 dubbo.application.loggerslf4j # 扫描注册com.forlan包下的所有服务接口 dubbo.scan.base-packagescom.msedu.study # Dubbo协议名称 dubbo.protocol.namedubbo # Dubbo协议端口号 dubbo.protocol.port20883 # Dubbo协议使用的线程池类型为fixed固定大小线程池 dubbo.protocol.threadpoolfixed # Dubbo协议使用的线程数量为1000表示同时处理的请求数量 dubbo.protocol.threads1000 # Dubbo协议使用的线队列长度为2000当线程数达到最大值时新请求会被放入任务队列中等待处理 dubbo.protocol.queues2000 # 服务提供者的标签可以设置不同环境为不同标签 dubbo.provider.tagv2.8 # apiVersionFilter 版本过滤器保证tag延续 dubbo.provider.filterapiVersionFilter,providerFilter # Dubbo使用的注册中心为zookeeper地址为zk-cs:2181 dubbo.registry.addresszookeeper://zk-cs:2181 # 指定额外的注册中心键和值 dubbo.registry.extra-keysdefault.dubbo.tag # 使用简化的注册中心实现来减少注册中心的复杂性和性能开销 dubbo.registry.simplifiedtrue # Dubbo不在启动时检查注册中心的可用性 dubbo.registry.checkfalse # 在Dubbo中注册中心可以按照不同的分组来进行管理和区分这里指定注册中心的分组为 formal dubbo.registry.groupformal# 省略其它无关配置...标签过滤器 添加过滤器传递dubbo.tag用于标识和区分不同的服务 import org.apache.dubbo.rpc.Filter; import org.apache.dubbo.rpc.Invocation; import org.apache.dubbo.rpc.Invoker; import org.apache.dubbo.rpc.Result; import org.apache.dubbo.rpc.RpcContext; import org.apache.dubbo.rpc.RpcException; import org.apache.dubbo.common.Constants;public class ApiVersionFilter implements Filter {Overridepublic Result invoke(Invoker? invoker, Invocation invocation) throws RpcException {String version invocation.getAttachment(dubbo.tag);if (StringUtil.isNotEmpty(version)) {RpcContext.getContext().setAttachment(dubbo.tag, version);}Result result invoker.invoke(invocation);return result;}}提供者过滤器 在每个rpc被调用前执行特定逻辑清空本地线程变量 import org.apache.dubbo.common.Constants; import org.apache.dubbo.common.extension.Activate; import org.apache.dubbo.rpc.Filter; import org.apache.dubbo.rpc.Invocation; import org.apache.dubbo.rpc.Invoker; import org.apache.dubbo.rpc.Result; import org.apache.dubbo.rpc.RpcException;Activate(group provider,value providerFilter) public class ProviderFilter implements Filter{Overridepublic Result invoke(Invoker? invoker, Invocation invocation) throws RpcException {// 清空本地线程变量ThreadLocalUtil.clearThreadVarible();Result result invoker.invoke(invocation);return result;} }2、dubbo服务消费者/Controller 1启动类 SpringBootApplication EnableDiscoveryClient EnableDubbo public class ForlanRestApplication {public static void main(String[] args) {SpringApplication.run(ForlanRestApplication.class, args);} }EnableDiscoveryClient的作用服务注册到服务注册中心并且能够发现其他注册的微服务实例 EnableDubbo的作用启用Dubbo服务标识该类作为Dubbo服务的提供者或消费者 2配置类 # Dubbo应用名 dubbo.application.nameforlan-consumer # 设置应用日志记录器如Log4j、Logback和Java自带的JULJava Util Logging来记录Dubbo框架的日志信息 dubbo.application.loggerslf4j # 扫描注册com.forlan包下的所有服务接口 dubbo.scan.base-packagescom.forlan # Dubbo协议名称 dubbo.protocol.namedubbo # Dubbo协议端口号 dubbo.protocol.port20880 # 消费者在启动时是否检查服务提供者的可用性false表示在调用服务时才检查 dubbo.consumer.checkfalse # 消费者调用服务的超时时间这里设置为50秒 dubbo.consumer.timeout50000 # 消费者在服务调用失败时的重试次数默认值为0表示不进行重试 dubbo.consumer.retries0 # 消费者使用的过滤器链 dubbo.consumer.filterconsumerFilter,-consumercontext,tagRouterFilter # Dubbo使用的注册中心为zookeeper地址为zk-cs:2181 dubbo.registry.addresszookeeper://zk-cs:2181 # 指定额外的注册中心键和值 dubbo.registry.extra-keysdefault.dubbo.tag # 使用简化的注册中心实现来减少注册中心的复杂性和性能开销 dubbo.registry.simplifiedtrue # Dubbo不在启动时检查注册中心的可用性 dubbo.registry.checkfalse # 在Dubbo中注册中心可以按照不同的分组来进行管理和区分这里指定注册中心的分组为 formal dubbo.registry.groupformal # 省略其它无关配置...ConsumerFilter 获取公共参数accessToken、requestUUID从本地线程取设置到dubbo接口上下文中 import com.msedu.common.utils.ThreadUtil; import org.apache.dubbo.common.Constants; import org.apache.dubbo.common.extension.Activate; import org.apache.dubbo.rpc.*;Activate(group consumer,value consumerFilter) public class ConsumerFilter implements Filter{Overridepublic Result invoke(Invoker? invoker, Invocation invocation) throws RpcException {Result result null;try {// 调用dubbo接口前存入上下文参数String accessToken (String) ThreadUtil.get(accessToken);String requestUUID (String) ThreadUtil.get(requestUUID);RpcContext.getContext().setAttachment(accessToken, accessToken);RpcContext.getContext().setAttachment(requestUUID, requestUUID);result invoker.invoke(invocation);}catch(Exception e) {throw e;}return result;}}TagRouterFilter 项目中配置了-consumercontext表示移除默认的ConsumerContextFilter用TagRouterFilter替换之所以要替换是因为dubbo自带的过滤器会在调用完成之后清理掉Attachments由于我们需要在Attachments中保留dubbo.tag否则无法找到对应的服务这就是TagRouterFilter的作用其实就是保留了tag路由RpcContext.getContext().setAttachment(“dubbo.tag”, invocation.getAttachment(“dubbo.tag”)) Activate(group consumer, order -10000) public class TagRouterFilter implements Filter {Overridepublic Result invoke(Invoker? invoker, Invocation invocation) throws RpcException {RpcContext.getContext().setInvoker(invoker).setInvocation(invocation).setLocalAddress(NetUtils.getLocalHost(), 0).setRemoteAddress(invoker.getUrl().getHost(), invoker.getUrl().getPort());if (invocation instanceof RpcInvocation) {((RpcInvocation) invocation).setInvoker(invoker);}try {RpcContext.removeServerContext();return invoker.invoke(invocation);} finally {RpcContext.getContext().clearAttachments();}}Overridepublic Result onResponse(Result result, Invoker? invoker, Invocation invocation) {RpcContext.getServerContext().setAttachments(result.getAttachments());//保留tag路由RpcContext.getContext().setAttachment(dubbo.tag, invocation.getAttachment(dubbo.tag));return result;}}在Dubbo中AbstractRouter是一个抽象类用于实现路由策略。它的作用是根据一定的规则决定将请求路由到哪个服务提供者。具体的路由策略可以通过继承AbstractRouter类并实现其中的方法来自定义。Dubbo提供了多种内置的路由策略如基于标签、基于权重等。通过配置AbstractRouter的实现类可以灵活地控制服务的路由行为。 3、Eureka服务端 1启动类 import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient;SpringBootApplication EnableEurekaServer public class EurekaServerApplication {public static void main(String[] args) {SpringApplication.run(EurekaServerApplication.class, args);} }2配置类 # 客户端是否注册到eureka默认true这里为false eureka.client.register-with-eurekafalse # 是否从Eureka服务器获取注册信息如果单节点不需要同步其他节点数据用false eureka.client.fetch-registryfalse # true实例以IP的形式注册;false实例以主机名的形式注册 eureka.instance.preferIpAddresstrue # 客户端注册到的Eureka服务器地址 eureka.client.serviceUrl.defaultZonehttp://localhost:8300/eureka/ #Eureka服务器中用于清理过期实例的驱逐间隔时间默认5000ms eureka.server.evictionIntervalTimerInMs5000 # Eureka服务器更新响应缓存的时间间隔服务器本地会缓存一份确保响应性能但又需要确保是最新的需要定期拉取 eureka.server.responseCacheUpdateIntervalMs5000 # Eureka服务器是否使用只读响应缓存false表示可以对缓存修改一般建议false eureka.server.use-read-only-response-cachefalse # Eureka服务器是否启用自我保护机制默认true eureka.server.enable-self-preservationfalse4、Eureka客户端 1启动类 其实已经作为dubbo的消费者一样的启动类 2配置类 #eureka地址 eureka.client.serviceUrl.defaultZonehttp://localhost:8300/eureka/ # 服务示例的版本号 eureka.instance.metadata-map.versionv2.8 # true实例以IP的形式注册;false实例以主机名的形式注册 eureka.instance.preferIpAddresstrue # Eureka客户端发送心跳保持租约的时间间隔默认30s这里设置为3s即每3秒发送一次续约 eureka.instance.leaseRenewalIntervalInSeconds3 # Eureka客户端租约到期时间默认90s这里设置为10s即服务器10s内没收到心跳则认为该实例不可用 eureka.instance.leaseExpirationDurationInSeconds10 # true客户端会从服务注册中心获取并缓存服务注册表的信息false仅使用本地缓存的信息客户端默认为true eureka.client.fetchRegistrytrue # 客户端获取服务注册表的间隔时间即刷新本地缓存时间间隔默认30s eureka.client.registryFetchIntervalSeconds5一般的话eureka.instance.leaseExpirationDurationInSeconds设置为eureka.instance.leaseRenewalIntervalInSeconds的两倍或更多以确保在网络故障或其他问题时仍能保持可用 三、总结 在项目中SpringCloud和Dubbo配置使用其实还是注册到两个注册中心。 Eureka 网关和对外提供API访问的服务都注册到Eureka主要是为了方便网关进行路由网关可以从Eureka获取服务的注册信息包括服务的主机和端口等信息。这样网关就可以根据需要将请求路由到相应的服务实例上实现请求的转发和负载均衡。同时通过Eureka的服务发现机制网关可以动态地获取服务实例的变化以便及时更新路由规则。这种方式可以提高系统的灵活性和可扩展性使网关能够自动适应服务实例的变化。 Zookeeper 相关service服务提供者和对外提供API访问的服务注册到Zookeeper一方作为Dubbo服务提供者一方作为Dubbo服务消费者通过dubbo进行调用 总的来说就是对外提供API访问的的服务和网关一起注册到Eureka方便网关路由并且这些服务也作为Dubbo消费者注册到Zookeeper同时相关服务提供者注册到Zookeeper即可两者通过Dubbo进行调用。 思考题 1、Dubbo可以使用的注册中心 默认使用的是Zookeeper作为注册中心还可以使用Eureka、Nacos作为注册中心。 2、Dubbo集成使用Eureka和Zookeeper有什么区别 区别在于注册中心的选择和配置方式 当集成Eureka时注册中心使用的是Eureka而集成Zookeeper时注册中心使用的是ZookeeperEureka是基于RESTful的服务注册与发现组件适用于微服务架构而Zookeeper是一个分布式协调服务适用于分布式系统 3、服务A只注册到EurekaDubbo服务提供者B注册到Zookeeper此时服务A可以调用到B? 可以但需要在服务A中手动指定服务B的地址信息。如果想通过dubbo调用是不可以的因为服务A只注册到Eureka而Dubbo默认使用的是Zookeeper作为注册中心所以服务A无法通过Dubbo直接调用到服务B那么服务A需要将自己注册到Zookeeper作为Dubbo的注册中心才能拉取到服务注册列表进行dubbo调用。 4、对外提供API访问的服务同时注册到了Eureka和Zookeeper中两个独立注册中心需要同步机制来保证一致性 Eureka的心跳间隔默认为30秒项目中设置为3s而Zookeeper的心跳间隔为两倍的tickTime默认情况下tickTime为2000毫秒2秒所以心跳间隔为4秒。两者的心跳间隔不一致会导致服务状态出现短暂的不一致可以调整心跳间隔保持一致也可以需要使用同步处理机制。 具体方案有 通过监听器机制在服务注册时可以注册监听器用于监听Eureka和Zookeeper中的服务变化。当服务状态发生变化时监听器可以接收到通知并更新另一个注册中心中的服务状态。通过定时任务定时任务可以周期性地检查Eureka和Zookeeper中的服务状态如果发现状态不一致则进行相应的同步操作。通过事件驱动当服务状态变化时Eureka和Zookeeper可以发布事件通知其他服务节点其他节点通过接收事件来进行状态同步。双向注册中心同步在服务注册或状态变更时同时将变更信息同步到两个注册中心中保证双方的服务状态一致性。 5、对外提供API访问的服务为什么要同时注册到了Eureka和Zookeeper 兼容性问题为了保持兼容性同时注册到两个注册中心以便能够被不同的组件发现和调用弹性和高可用性要求如果其中一个注册中心出现故障或不可用另一个注册中心仍然可以正常工作确保系统的稳定性跨平台支持支持跨不同平台或技术栈的服务发现和调用
http://www.dnsts.com.cn/news/220837.html

相关文章:

  • 太原市做网站好的科技公司天河建网站公司
  • 中山市网站开发外包公司珠市口网站建设
  • 比较好的网站开发服务商有教做桥梁质检资料的网站吗
  • 环球旅游网的网站建设南京 外贸网站建设
  • 树立网站风格的步骤河北pc端网站建设
  • 贵阳网站建设外包成都网站备案查询
  • 网站建设的注意美工宝盒网站
  • wordpress开源程序建站教程2345网址导航官方网站
  • 网站前台设计模板一个人怎样做网站
  • 网站权重6了该则么做优化方案网页设计模板素材图片旅游
  • 网站建设需要具备哪些wordpress知识管理
  • 遵义网站制作费用培训心得体会100字
  • 我有云服务器如何建站wordpress 装插件 ftp ssh连接
  • 网站选服务器文件百度统计手机版
  • 常熟做公司网站私人网站建设
  • 公司网站建设如何做账ui设计基础知识
  • 做网站的dw全称是啥wordpress表单编辑插件下载
  • 阳泉市编办网站三基建设网站建设关键词排名优化
  • 国内做的比较好的二手网站济南 网站设计公司
  • 创立一个网站需要什么广州百度推广开户
  • 免费网站建设报价佛山建站公司哪家好
  • 苏州企业网站建设开发与制作自己做网站怎么跳过备案
  • 鹏达建设集团有限公司网站做网站用的编程工具
  • 国内外网站建设比较网站开发中网页之间的链接形式有什么
  • 南充网站建设多少钱sns有哪些著名的网站有哪些
  • 医院门户网站建设做网站销售工资
  • 网站的发布与推广方式asp网站建设 win7
  • 检查网站收录问题免费网站登陆模板
  • 南京网站设计外包wordpress 教垜
  • 请问哪里可以做网站wordpress升级插件出现意外错误