Dubbo的基本使用

1.传统项目与互联网项目

相信很多小伙伴或多或少都接触过这两类项目,相较于传统项目,互联网的项目特点如下

  1. 客户多,用户多
  2. 流量大!
  3. 数据量大!
  4. 安全性要求较高!
  5. 变更迭代快!
  6. 功能更复杂一些!

为什么要提这个呢,是为了更好的理解dubbo解决的一些痛点问题。

1.1 互联网项目的指标

  1. 响应时间!
  2. 并发数量:单位时间内请求的链接数、用户数、请求数QPS。
  3. 吞吐量:QPS、TPS(事务数,tps包含了很多链接)

然后一个好的项目的目标是什么呢?怎么衡量项目的成功与否呢?

  1. 高性能!传统意义上的速度快!用户体验极佳
  2. 高可用!意思就是你网站崩掉的次数少!或者没有,你看著名的网站崩了是不是都会上热搜?
  3. 可伸缩!如果我某个服务请求过多了,一台机器搞不定了,我可以部署多个服务器,保持网站的可用性!
  4. 可扩展!意思就是增加或者删除功能的时候不会牵一发动全身,各个模块之间的耦合性非常低!
  5. 安全性!被别人攻击获取信息的事情肯定是不能干的是吧!
  6. 敏捷性!当业内有一个新的功能出现的时候我能够快速的copy实现,懂得都懂!

1.2 集群和分布式

集群就是我一个项目部署多个服务器,注意!项目的代码是一样的,做的事情都是一样的!

分布式就是每个服务器做的事情都是不一样的!不同服务之间相互配合可以做成一个大事!

当然集群和分布式是缺一不可的。相辅相成!

1.3 架构演变

  1. 单体架构!优点就是部署简便,缺点:当业务代码越来越多,相应的项目启动就会越来越慢!单体项目里面模块之间会相互影响,我一个模块启动有问题,整个项目就会挂掉!拓展性很差,容易牵一发动全身。最后就是性能过低!
  2. 垂直架构!垂直架构简而言之就是把单体架构的模块拆成一个独立的项目。优点就是缓解了单体架构的一些缺点,当然垂直架构还是会存在单体架构的弊端,只是稍微好一点。缺点就是冗余的代码太多了,比如用户管理,两个不同的项目,肯定用户管理都是自己的,这样一来,我要维护的时候,每个项目都要去改一下,是不是很麻烦?
  3. 分布式架构!就是把公共的功能拆解出来,其他的服务要用到就来调用。这边就会是用到RPC,远程过程调用。通过这种技术,可以实现服务之间的调用。分布式也会存在新的问题,某个公共的项目如果服务器端口改变了,其他涉及到这个项目的都会要去改。
  4. SOA架构!目前也是很多公司用的架构体系,都会使用到一个ESB消息总线,每个服务需要调用其他系统的时候,需要把请求先发送给ESB消息总站,然后ESB通过报文头去调用各个服务!那么分布式的问题就能够解决了,我服务端口改变了只需要告诉ESB,其他服务不需要知道我的ip和端口。ESB知道就行!
  5. 微服务架构!微服务架构其实和SOA非常相似。微服务主要强调的是组件化,模块化,服务化。就是专精做一件事情!

然后这次Dubbo就是SOA时代的产物,SpringCloud是微服务时代的产物。

2.Dubbo

RPC框架、阿里巴巴、阿帕奇收购。记住这些关键词就行。

2.1 Spring集成Dubbo

这边遇到一个错误,这边的错误原因是dubbo服务提供方的接口的包位置和服务方接口的包位置不一致!这边是必须一致的,不然dubbo找不到实现类。先说错误免得踩坑,当然后面也会说最好的方案!解决这个问题,这边代码比较多,可以跳着看。

Caused by: java.lang.IllegalStateException: Failed to check the status of the service com.zx.Controller.Service.UserService. No provider available for the service com.zx.Controller.Service.UserService from the url zookeeper://124.567.99.678:2181/org.apach

2.1.1 服务方的配置文件

web.xml

<?xml version="1.0" encoding="UTF-8" ?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns="http://java.sun.com/xml/ns/javaee"xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"version="2.5">
<context-param><param-name>contextConfigLocation</param-name><param-value>classpath*:applicationContext*.xml</param-value>
</context-param><listener><listener-class>org.springframework.web.context.ContextLoaderListener</listener-class></listener>
</web-app>

applicationContext.xml

<?xml version="1.0" encoding="UTF-8" ?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:dubbo="http://dubbo.apache.org/schema/dubbo"xmlns:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsdhttp://dubbo.apache.org/schema/dubbohttp://dubbo.apache.org/schema/dubbo/dubbo.xsd
"
>
<!--    <context:component-scan base-package="com.zx" />
注册到注册中心的应用名称--><dubbo:application name="dubboService"/>
<!--注册中心地址--><dubbo:registry address="zookeeper://124.110.99.110:2181"/>
<!--dubbo 注解扫描的包--><dubbo:annotation package="com.zx"/>
</beans>

接口和实现类,接口就补贴了很简单

package com.zx.Impl;import com.zx.UserService;
import org.apache.dubbo.config.annotation.Service;@Service//这边的service是dubbo包里的,这个注解会把这个服务注册到zookeeper上去
public class UserServiceImpl implements UserService {public String findName() {return "hasai!";}
}

2.1.2 客户端配置

web.xml

<?xml version="1.0" encoding="UTF-8" ?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns="http://java.sun.com/xml/ns/javaee"xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"version="2.5"><servlet><servlet-name>springmvc</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><init-param><param-name>contextConfigLocation</param-name><param-value>classpath*:spring/springmvc.xml</param-value></init-param></servlet><servlet-mapping><servlet-name>springmvc</servlet-name><url-pattern>*.do</url-pattern></servlet-mapping>
</web-app>

springmvc.xml

<?xml version="1.0" encoding="UTF-8" ?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xmlns:mvc="http://www.springframework.org/schema/mvc"xmlns:dubbo="http://dubbo.apache.org/schema/dubbo"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd
http://dubbo.apache.org/schema/dubbohttp://dubbo.apache.org/schema/dubbo/dubbo.xsd
"
><mvc:annotation-driven/><context:component-scan base-package="com.zx.Controller"/><dubbo:application name="dubboWeb"/><dubbo:registry address="zookeeper://124.223.99.145:2181"/><dubbo:annotation package="com.zx.Controller"/>
</beans>

ctl和接口接口就不贴了

package com.zx.Controller;import com.zx.UserService;
import org.apache.dubbo.config.annotation.Reference;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
@RequestMapping("/test")
public class UserCtrl {
//    @Autowired@Reference//从注册中心去拿地址UserService userService;@RequestMapping("/findName")public String findName(){return userService.findName();}
}

2.1.3 错误原因解析

这个地址必须和服务提供方的接口地址一样,如果接口多了就能保证都一摸一样嘛,为了保证一样可以把接口定义成一个jar,大家商量好,都用这个jar 就行。

2.2 dubbo-admin

M1 Mac安装node.jshttps://blog.csdn.net/qq_33105531/article/details/121873709

dubbo-admin  git地址https://github.com/apache/dubbo-admin

clone下来之后改一个注册中心的地址配置文件,改成你自己的注册中心地址。

 前端项目先编译

 然后在

自此admin启动成功!

界面如下

 配置文件服务端的

2.3 序列化

如果想要把对象在网络中传输,那么就要将类序列化,这个就不多说了实现Serializable接口

import java.io.Serializable;
/**所有要在网络中传输的对象,都要实现序列化这个接口*/
public class Yxlm implements Serializable {

2.4 地址缓存

面试题:注册中心挂了,还可以访问嘛?答案是可以的,如果注册中心上的地址我们访问过,就会缓存到本地,就算注册中心挂了,也是可以拿到缓存的地址进行访问。

2.5 超时、重试机制

相信大家在开发过程中也会遇到这个问题,客户端请求服务端的时候,如果对象一直不返回数据,那么我这个客户端的线程就会一直等待,在流量小的时候是没问题的,但是在流量大的时候这个接口有几百万个线程来请求,那么客户端的资源就会用光,从而导致雪崩的效应。为了解决这个问题,dubbo有个超时和重试这两个机制,超时就是我固定时间可以设置超时的时间内不给我返回,我就断开。重试的意思就是我再试试可以固定次数!都不行的话我就不请求了!
当然超时时间客户端和服务端都可以设置。客户端设置的意思就是这么长时间不返回我就不要了,客户端设置的意思,你请求的这个接口时间太长了,我不给你提供服务了。一般常用的超时是配置在服务端

客户端

@Reference(timeout = 1000)HeroServcie heroServcie;

服务端,retries 是重试次数,这边设置的是2次,连上开始的一次一共请求了三次

@Service(timeout = 3000,retries = 2)
public class HeroServiceImpl implements HeroServcie {

2.6 多版本

灰度发布:我一个服务可能会有多个版本,那么部署上去的时候我肯定不会让所有客户端都链接到我新的服务上去,万一有问题,那就是全部都有问题了,灰度发布的意思就是我先让一部分客户端尝尝鲜,但是客户端会有一部分保留继续请求老的版本,如果最后新版本没问题,那么将剩下使用老版本的客户端都改成新版本。

服务端多版本

@Service(timeout = 3000,retries = 2,version = "V2.0")
public class HeroServiceImpl2 implements HeroServcie {@Service(timeout = 3000,retries = 2,version = "V1.0")
public class HeroServiceImpl implements HeroServcie {

客户端可以选择调用某个实现

@Reference(timeout = 1000,version = "V2.0")HeroServcie heroServcie;

2.7 负载均衡

先直接启动某个服务三次,最后在dubboadmin中可以查看到三个服务注意有三个地方的端口要改

第一就是tomcat端口,下面这两个端口也要更改。保证三个服务端口都不冲突

<dubbo:protocol port="20333"></dubbo:protocol><dubbo:application name="dubboService"><dubbo:parameter key="qos.port" value="22122"/></dubbo:application>

并且设置权重

@Service(timeout = 3000,retries = 2,version = "V1.0",weight = 200)
public class HeroServiceImpl implements HeroServcie {

启动成功之后在admin里面界面是这个样子的

服务端调用方式

 @Reference(timeout = 1000,version = "V1.0",loadbalance = "random")HeroServcie heroServcie;

 这边的loadbalance就是负载均衡策略一共有四种

  1. random 随机
  2. RoundRobin 根据权重来调用
  3. LeastActive 最少活跃调用数,相同活跃数的随机。
  4. ConsistentHash 一直性hash,相同参数的请求总是发到统一提供者,简而言之你的请求参数相同的都打到同一台机器上

2.8 集群容错

如果调用出错了,我们会采取什么机制,出错了我就不请求了,还是选择再试试。这边就是dubbo给我们提供的容错机制

   @Reference(cluster = "failover")//从注册中心去拿地址UserService userService;
  1. Failover Cluster 失败重试,和上面的超时重试差不多的意思,就是报错我也会重试几次,这边一般是用在查询的操作上,写的操作不能使用这个,会出现问题。

 这边我就讲一个但是官网的文档写的非常详细同学们移步官网

2.9 服务降级

@Reference(cluster = "failover",mock = "force:return null")//从注册中心去拿地址UserService userService;

官方文档中也是有的,我这边稍微解释一下,上面的降级方法就是,我请求都不请求了,这个接口返回null

下面的降级方法还是会请求一下的,失败了就返回null。

结束语

以上就是所有dubbo的基本使用,后面有机会,会出一个dubbo源码的解析。 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/8486.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

用Express和Vue3实现ChantGPT搭建教程及前后端源码

ChantGPT很多&#xff0c;网上很多说的ChantGPT搭建及源码都是假的&#xff0c;无法使用的&#xff0c;自己研究了好几天&#xff0c;搞定了基于Vue3搭建ChantGPT前后端端源码及搭建教程&#xff0c;现在分享出来&#xff0c;有喜欢的朋友自行下载搭建&#xff0c;用的是openAP…

chatgpt赋能python:如何使用Python捕获所有异常

如何使用Python捕获所有异常 简介 Python是一种高级编程语言&#xff0c;它广泛应用于Web开发、数据分析、机器学习、人工智能等领域。但是&#xff0c;在编写代码时&#xff0c;难免会遇到各种各样的异常情况&#xff0c;如文件不存在、网络连接超时、空指针引用等等。这些异…

chatgpt赋能python:PythonTCP断开连接原因和解决方案

Python TCP 断开连接原因和解决方案 Python 是一种广泛使用的编程语言&#xff0c;它支持网络编程、数据处理、人工智能、机器学习等诸多领域。在网络编程中&#xff0c;Python 通常使用 TCP 连接传输数据。然而&#xff0c;在使用 TCP 连接传输数据的过程中&#xff0c;我们可…

架构简析| 一种自动探索Minecraft的智能体

目录 VOYAGER概述自动课程&#xff08;Automatic Curriculum&#xff09;技能库&#xff08;Skill Library&#xff09;迭代提示机制&#xff08;Iterative Prompting Mechanism&#xff09;总结 参考SystemPromptSystemPrompt1SystemPrompt2SystemPromtp3SystemPrompt4SystemP…

福利!打造自己的ChatGPT聊天小程序,前后端代码全开源

简介 本文分享一个我前几个月实现的一个智能聊天系统小项目&#xff0c;包含了java后端&#xff0c;微信小程序端&#xff0c;web页面端三个子工程。 代码已经全部开源&#xff0c;地址放在了文末。 最近一年&#xff0c;chatGPT的火爆程度&#xff0c;已经不需要我再多说了…

chatgpt赋能python:Python怎么取消运行

Python怎么取消运行 Python作为一种高级编程语言&#xff0c;已经成为许多工程师的首选。然而&#xff0c;在开发过程中&#xff0c;有时候会遇到程序长时间运行的情况&#xff0c;需要手动取消运行。本文将介绍Python如何取消运行&#xff0c;以及一些常见的场景和注意事项。…

利用群晖部署ChatGPT-web服务,不需要代理,直接起飞,搭建你的私人AI助理

&#x1f31f;自建chatgpt-web是一个非常实用的AI服务&#xff0c;它可以帮助我们完成很多任务&#xff0c;而且&#xff0c;OpenAI的收费也非常实惠&#xff0c;自用一个月也就一两美刀&#xff0c;真的不贵&#xff01;&#x1f4b8; &#x1f916;需要注册一个账号&#xf…

Centos使用容器布署chatgpt-web

一、安装docker和docker-compose 1、卸载旧版本docker sudo yum remove -y docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \docker-engine2、安装yum-utils sudo yum install -y yum-utils sudo …

解决用 posman 调用 openai API 正常,用java代码调用超时问题

参考&#xff1a;https://github.com/PlexPt/chatgpt-java 一、接口调用 posman 调用正常 java 调用报错&#xff1a;ConnectException: Connection timed out: connect cn.hutool.core.io.IORuntimeException: ConnectException: Connection timed out: connectat cn.hut…

ChatGPT超时,TimeoutError问题解决方法

最近实验需要用到chatGPT&#xff0c;就试着调了一下 输入以下代码&#xff0c;运行 import openai openai.api_key "your_api_key"def askGPT(prompt):model_engine "text-davinci-003"completions openai.Completion.create(enginemodel_engine,pro…

自托管 NodeJS ChatGPT Discord 机器人

GBTI Labs 宣布面向开发人员的自托管 NodeJS ChatGPT Discord Bot BTI Labs 是一个私人开发运营团体和会员社区&#xff0c;自豪地宣布发布其自托管 NodeJS ChatGPT Discord 机器人&#xff0c;旨在为开发人员提供将 ChatGPT 和其他类似语言模型集成到 Discord 聊天机器人中的先…

GPT-4发布!ChatGPT大升级!太太太太强了!

ChatGPT狂飙160天&#xff0c;世界已经不是之前的样子。 我新建了人工智能中文站https://ai.weoknow.com 每天给大家更新可用的国内可用chatGPT资源 一觉醒来&#xff0c;万众期待的GPT-4&#xff0c;它来了&#xff01; OpenAI老板Sam Altman直接开门见山地介绍说&#xff1a…

GPT-4刚刚发布!ChatGPT大升级!太太太太强了!

金磊 梦晨 发自 凹非寺量子位 | 公众号 QbitAI 一觉醒来&#xff0c;万众期待的GPT-4&#xff0c;它来了&#xff01; OpenAI老板Sam Altman直接开门见山地介绍说&#xff1a; 这是我们迄今为止功能最强大的模型&#xff01; 有多强&#xff1f; 根据OpenAI官方的介绍&#xff…

ChatGPT智能聊天系统重磅升级!新增分销功能!快来体验吧!

ChatGPT智能聊天系统更新至v1.1.2版本啦~主要更新内容如下&#xff1a; 新增功能 注册账号 生成对话海报 分销功能 支持小程序 会员功能控制 敏感词库 用户支持加入黑名单 后台-用户列表新增用户开通会员的筛选 细节优化 对话内容markdown渲染 用户条数用完&#xf…

GPT-4正式发布!ChatGPT大升级!太强了!

金磊 梦晨 发自 凹非寺量子位 | 公众号 QbitAI 一觉醒来&#xff0c;万众期待的GPT-4&#xff0c;它来了&#xff01; OpenAI老板Sam Altman直接开门见山地介绍说&#xff1a; 这是我们迄今为止功能最强大的模型&#xff01; 有多强&#xff1f; 根据OpenAI官方的介绍&#xff…

ChatGPT会写代码?那还要程序员干嘛?

前言 当今时代&#xff0c;人工智能发展速度超乎想象。从打败国际象棋世界冠军&#xff0c;到象棋&#xff0c;围棋&#xff0c;甚至星际争霸&#xff0c;人工智能的恐怖之处逐渐被大家认知&#xff0c;而最近火出圈的ChatGPT&#xff0c;已经可以写出优美的文章&#xff0c;和…

软件测试+ChatGPT之一:软件测试理论指导

软件测试ChatGPT之一&#xff1a;软件测试理论指导 ChatGPT是理论知识库&#xff0c;是答疑老师&#xff1b;通过ChatGPT可以更便捷的方式了解和学习软件测试基本理论。 包括&#xff1a; -学习资料、书籍推荐 -做软件测试应具备的技能、测试基本概念 -项目流程、软件测试流程…

ChatGPT 已经对软件开发行业造成了什么影响?IT老工程师告诉你

ChatGPT已经对软件开发行业造成了什么影响&#xff1f; 一、前言二、ChatGPT无法替代软件开发人员三、ChatGPT对软件行业积极的影响四、获取<ChatGPT行业研究报告白皮书>大全 一、前言 作为一个15年工龄资深Java开发工程师&#xff0c;客观说&#xff0c;ChatGPT不会对程…

AI视频剪辑,击败抖音82%作者

AI在视频创作中有许多优势。它可以快速生成高质量的视觉效果&#xff0c;例如特效、场景和角色。并且可以自动化重复性任务&#xff0c;如图像和音频编辑&#xff0c;并且可以在不同平台上进行多个版本的创建和发布。下面我们看下如何用AI来快速生成视频投放。视频的生成和投放…

花了几个周末上线了一个未来百科AI工具网站,ChatGPT已帮我写好了介绍~

PS&#xff1a;以下内容由ChatGPT生成 未来百科AI工具网站&#xff0c;为发现全球优质AI工具而生&#xff0c;聚集1600优质AI工具产品。这个网站的AI工具包括ChatGPT, ChatGPT工具, AI工具, 未来百科, AI绘画, AIGC, AI导航, 视频AI, 语音AI, 图像AI等。这些工具可以帮助用户更…