Spring Cloud之acos服务注册与Dubbo

news2025/2/5 17:52:31

Spring Cloud之acos服务注册与Dubbo

nacos是springcloud的扩展,注册中心功能通过NacosDiscoveryClient 继承DiscoveryClient,在springcloud中,与Eureka可以无侵入的切换。注册中心可以手动剔除服务实例,通过消息通知客户端更新缓存的实例信息。

Dubbo是一个分布式服务框架,Doubbo的产生让我们告别了HTTP+restful和webservice进行服务数据交互的模式,而Doubbo采用的是分布式SOA服务治理方案,通过RPC远程调用服务。

在项目中注意:

1、product和consumer的包名需一致。

2、Spring boot的版本为2.1.5.RELEASE

3、Product中调用dubbo中config的Service,在consumer端调用dubbo的config中的Reference,同时指定group和version,保证Product和consumer生产者和消费者之间的通信。

一、spring cloud的provider服务端的建立

这里以Intellij IDEA 2021为例来使用Spring Cloud进行nacos的服务注册及Dubbo分布式框架的使用。

1、点击”文件”--->”新建”---->”项目”。

 

2、在弹出的对话框中,左边点击Spring Initializr初始化项目,在右边出现对应的栏目, 在名称栏输入项目名称,注意java的对应版本。如下图。

 

3、然后点击“下一步”进入项目向导的下一步。在左边的Developer Tools中选择lombok,在右边web栏目下选择Spring Web。如下图。

 

设置完成后,点击“完成”即可。

设置pom.xml的依赖关系,这里需要添加dubbo和nacos的依赖,需要添加3个依赖,如下。

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-dubbo</artifactId>
    <version>0.9.0.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-alibaba-nacos-discovery</artifactId>
    <version>0.9.0.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-alibaba-nacos-config</artifactId>
    <version>0.9.0.RELEASE</version>
</dependency>

还需要一个使用 spring-boot-starter-actuator 包,其可以用于检测系统的健康情况、当前的Beans、系统的缓存等。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

其依赖包设置后,如下图所示。

 

注意,这里设置org.junit.jupiter包,这个包是spring boot测试的依赖包。

依赖设置成功后,需要重新加载项目。如下图所示。

 

接下来建立services包,结构如下图。

 

注意,这里的包名是com.example,除了生产者这样,消费者也需要这样的包名。

在services包点击“新建”-->“java类”。如下图。

 

在这里输入Balancer类,并设置Balancer类中的属性为

id,diamon,ticket和message。

Balancer类的代码如下。

package com.example.services;
import lombok.Data;
import lombok.AllArgsConstructor;
import lombok.NoArgsConstructor;
import java.io.Serializable;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Balancer implements Serializable{
    private int id;
    private int diamond;
    private int ticket;
    private String message;
}

Balancer类由于需要从生产端Producer向Consumer消费端传送,这里需要实现Serializable序列化,代码如图所示。

 

利用实现的Balancer类,设置BalancerService服务接口,这里新建服务类接口,如下图所示。

 

在新建Java类后,选择接口,并命名为BalancerService,如下图所示。

 

在接口中设置获取Balancer接口方法getBalancer。代码如下。

package com.example.services;

public interface BalancerService {
    public Balancer getBalancer(Integer id);
}

现在需要实现BalancerService接口的实现类,新建java的实现类如下图。

 

新建的类名,输入BalancerServiceImpl确定BalancerService的实现类,如下图。

 

实现类中需要声明dubbo的service服务,这样可以保证在消费端进行消费。实现的getBalancer接口中,产生静态的balancer信息,通过传入的id获取对应的balancer信息。代码如下。

package com.example.services;
import org.apache.dubbo.config.annotation.Service;
import java.util.Map;
import java.util.HashMap;
@Service(protocol="dubbo",group="dubbo",version="1.0.0")
public class BalancerServiceImpl implements BalancerService{
    final static Map<Integer,Balancer> balancerMap=new HashMap<Integer,Balancer>(){
        {
            put(1,new Balancer(1,10,1000,"OK"));
            put(2,new Balancer(2,0,10000,"OK"));
            put(3,new Balancer(3,100,0,"OK"));
        }
    };
    @Override
    public Balancer getBalancer(Integer id) {
        if(id!=null&&balancerMap.containsKey(id)){
            return balancerMap.get(id);
        }
        return new Balancer(0,0,0,"不存在");
    }
}

这里定义了静态的balacerMap,并注入了3个balancer类型的信息。

在getBalancer实现接口的方法中,通过Map的get方法获取对应键的balancer信息。如果没有这个balancer就返回空的balancer信息。

在主类上,还需要设置nacos服务注册能够发现这样的注册信息,需要在主启动类上加上EnableDiscoveryClient注解。主类代码如下。

package com.example;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
@SpringBootApplication
@EnableDiscoveryClient
public class Myproductdubbo1Application {

    public static void main(String[] args) {
        SpringApplication.run(Myproductdubbo1Application.class, args);
    }

}

除了程序的设置外,还需要设置配置文件。配置文件上需要在resources文件夹下设置application.yml和bootstrap.yml.

application.yml中设置dubbo的服务名称。代码如下。

dubbo:
  scan:
    base-packages: com.example.services
  registry:
    address: spring-cloud://localhost
  protocols:
    dubbo:
      name: dubbo
      port: -1
  application:
    qos:
      enable: false

这里设置dubbo分布式服务的scan扫描包,registry注册地址,及protocols协议,协议中的名称name命名为dubbo,这个名称必须与service中的protocol的名称一致。下图是两个代码的对比图。

 

bootstap.xml的配置文件内容如下。

spring:
  main:
    allow-bean-definition-overriding: true
  application:
    name: myprovider1
  cloud:
    nacos:
      discovery:
        enabled: true
        register-enabled: true
        server-addr: 127.0.0.1:8848
      config:
        server-addr: 127.0.0.1:8848

这里需要设置应用的名称,这个名称可以在消费端访问,同时需要设置nacos服务注册的发现地址,这个地址是nacos服务的注册地址。配置文件代码截图如下。

 

至此,spring cloud的provider服务端启动成功。

下面设置spring cloud 的consumer端。

二、spring cloud 的consumer端建立

1、点击”文件”--->”新建”---->”项目”

 

2、在弹出的对话框中,左边点击Spring Initializr初始化项目,在右边出现对应的栏目, 在名称栏输入项目名称,注意java的对应版本。如下图。

 

3、然后点击“下一步”进入项目向导的下一步。在左边的Developer Tools中选择lombok,在右边web栏目下选择Spring Web。如下图。

 

设置完成后,点击“完成”即可。

设置pom.xml的依赖关系,这里需要添加dubbo和nacos的依赖,

这里需要添加两个依赖。

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-dubbo</artifactId>
    <version>0.9.0.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-alibaba-nacos-discovery</artifactId>
    <version>0.9.0.RELEASE</version>
</dependency>

这里也需要一个使用 spring-boot-starter-actuator 包,其可以用于检测系统的健康情况、当前的Beans、系统的缓存等。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spri

其依赖包设置后,如下图所示。

 

注意,这里设置org.junit.jupiter包,这个包是spring boot测试的依赖包。

依赖设置成功后,需要重新加载项目。如下图所示。

 

接下来建立services包,结构如下图。

 

注意,这里的包名是com.example,消费者的包名称需要与生产者相同。

在services包点击“新建”-->“java类”。如下图。

 

在这里输入Balancer类,Balancer类需要与Provider端一样,这也是为了方便在consumer消费端调用Balancer 类中信息,并设置Balancer类中的属性为

id,diamon,ticket和message。

Balancer类的代码如下。

package com.example.services;
import lombok.Data;
import lombok.AllArgsConstructor;
import lombok.NoArgsConstructor;
import java.io.Serializable;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Balancer implements Serializable{
    private int id;
    private int diamond;
    private int ticket;
    private String message;
}

Balancer类由于需要从生产端Producer向Consumer消费端传送,这里需要实现Serializable序列化,代码如图所示。

 

利用实现的Balancer类,设置BalancerService服务接口,这里新建服务类接口,如下图所示。

 

在新建Java类后,选择接口,并命名为BalancerService,如下图所示。

 

在接口中设置获取Balancer接口方法getBalancer。代码如下。

package com.example.services;

public interface BalancerService {
    public Balancer getBalancer(Integer id);
}

接下来,在services包下建立User类,一个User类对应一个Balancer类。这里新建一个User类,如下图所示。

 

在新建Java类后,选择类,并命名为User,如下图所示。

 

User类的代码如下。

import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@NoArgsConstructor
public class User {
    private int id;
    private String name;
    private Balancer balancer;
    public User(int id, String name) {
        this.id = id;
        this.name = name;
    }
}

这里的User类有属性id和name,同时一个用户对应消费一个Balancer,这个Balancer需要通过id获取,因此这里获取User时只传入id和name两个参数。

Producer实现生产者,Consumer端实现消费者,消费者需要实现Controller控制器,通过控制器去消费服务端Producer的信息。

在Controller端需要定义Referece注解,Reference注解的作用指出。

让定义的接口引用去指向一个具体的接口实现,但是这个实现肯定不会是生产者端的实现,不然的话,RPC就没有意义了,所以我们现在来探究一下Dubbo中是如何实现的。其原理如下。

 

总的来说,就是我们看似在调用生产者的方法实现,实际上调用的是本地生成的方法,这个生成方法多种多样,不过这个实现是在内存中的实现,也就是说,消费者并不能显式的看到它.

在这个接口实现中具体要做的事情很明确,就是向生产者发送数据进行通信,并且获取它的返回值.当方法的入参中有类对象时,需要进行序列化转为字节流进行传输.而在生产者,接收到字节流之后要进行反序列化,然后进行具体的实现,再将处理结果返回给消费者(有需要的话需要再次序列化和反序列化)。

在Controller的方法中,除了Reference指定Service方法外,还需要设置user的相关信息,通过getUser的控制器方法获取User,同时设置User的Balancer内容。

package com.example.controller;
import com.example.services.BalancerService;
import com.example.services.User;
import org.springframework.web.bind.annotation.RestController;
import java.util.Map;
import java.util.HashMap;
import org.apache.dubbo.config.annotation.Reference;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
@RestController
public class AccountController {
    final static Map<Integer, User> mapperUser=new  HashMap<Integer,User>(){
        {
            put(1,new User(1,"张三"));
            put(2,new User(2,"李四"));
            put(3,new User(3,"王二麻子"));
        }
    };
    @Reference(version="1.0.0",group="dubbo")
    private BalancerService balancerService;
    @RequestMapping("/acc/user")
    public User getUser(@RequestParam Integer id){
        if(id!=null&&mapperUser.containsKey(id)){
            User user=mapperUser.get(id);
            user.setBalancer(balancerService.getBalancer(id));
            return user;
        }
        return new User(0,"");
    }
}

代码设置成功后,还需要设置配置文件 application.yml和bootstrap.yml文件。

application.yml配置文件内容如下。

spring:
  application:
    name: myprovider2
dubbo:
  registry:
    address: spring-cloud://localhost
  application:
    qos:
      enable: false
  cloud:
    subscribed-services: ${provider.application.name}
server:
  port: 8805
provider:
  application:
    name: myprovider1

这里设置了spring消费者的名称,也设置了dubbo的注册地址以及cloud端的subscribed-services属性,这个属性专门说明了用于消费者订阅提供方的应用名称列表。这里定义了provider的应用名称,也定义了provider 的application的应用name名称。

设置的bootstrap.yml文件如下。

spring:
  main:
    allow-bean-definition-overriding: true
  cloud:
    nacos:
      discovery:
        enabled: true
        register-enabled: true
        server-addr: 127.0.0.1:8848
      config:
        server-addr: 127.0.0.0:8848
    zookeeper:
      enabled: false
    consule:
      enaled: false
eureka:
  client:
    enabled: false
ribbon:
  nacos:
    enabled: false

生产者和消费者设置成功后,可以下载nacos的服务端,然后通过startup命令启动nacos,启动时可能会报Tomcat的错误,需要使用-m参数指定standalone独立启动。

启动界面如下图。

 

启动命令如下。

Startup -m standalone

启动后可以通过浏览器,访问localhost:8848/nacos,访问界面如下。

 

在nacos界面中输出用户名nacos和密码nacos。进入到nacos中的主页中。

 

这里启动product生产者。启动后,可以点击左侧“服务管理”中的“服务列表”查看启动的生产者服务。如下图所示。

 

这时可以看到启动的服务。

接下来再启动消费者。

也可以从nacos服务列表中看到启动的消费者。如下图。

 

现在,可以启动消费端的访问地址。

http://localhost:8805/acc/user?id=1

访问后页面的显示如下。

 

至此,项目创建结束。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【推荐】数据湖技术及实践与案例资料汇总合集47篇

数据湖或hub的概念最初是由大数据厂商提出的&#xff0c;表面上看&#xff0c;数据都是承载在基于可向外扩展的HDFS廉价存储硬件之上的。但数据量越大&#xff0c;越需要各种不同种类的存储。最终&#xff0c;所有的企业数据都可以被认为是大数据&#xff0c;但并不是所有的企业…

30多条立马执行的站内SEO优化建议

站内SEO优化,讲来讲去很多年,但是国内很少有比较全面的Check List。国外的文章,一般都是教你如何优化一篇文章。而不是教你如何打造一个一个商业化的产品页。本篇文章是结合我这几年的独立站SEO项目经验,对站内SEO进行的一些总结,有30多条立马执行的站内SEO优化建议。 其实…

SpringBoot+Actuator+Prometheus+Grafana进行可视化应用监控

最终效果 actuator actuator是什么 看一看chatGPT怎么说&#xff1f; Spring Boot Actuator是Spring Boot的一个子项目&#xff0c;它为监视和管理Spring Boot应用程序提供了附加功能。它提供了一组端点&#xff0c;允许您监视和管理应用程序&#xff0c;如运行状况检查、度量…

[附源码]计算机毕业设计Python电影推荐网站(程序+源码+LW文档)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程 项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等…

使用FastDeploy在英特尔CPU和独立显卡上端到端高效部署AI模型

目录 1.1 产业实践中部署AI模型的痛点 1.1.1 部署模型的典型流程 1.1.2 端到端的AI性能 1.1.3 部署模型的难点和痛点 1.2 FastDeploy简介 1.3 英特尔独立显卡简介 1.4 使用FastDeploy在英特尔CPU和独立显卡上部署模型的步骤 1.4.1 搭建FastDeploy开发环境 1.4.2 下载…

秒杀/抢购架构设计

1 秒杀业务分析 1.1 正常电子商务流程 &#xff08;1&#xff09;查询商品&#xff1b; &#xff08;2&#xff09;创建订单&#xff1b; &#xff08;3&#xff09;扣减库存&#xff1b; &#xff08;4&#xff09;更新订单&#xff1b; &#xff08;5&#xff09;付款&…

Odoo丨手把手教你灵活控制表单明细的创建与删除!

文章目录一、前言二、表单明细的创建与删除1.根据主表字段带出明细信息2.根据主表字段控制明细表的添加和删除功能三、总结一、前言 我们知道&#xff0c;在Odoo页面上&#xff0c;控制的最小单位是字段&#xff0c;可通过Odoo提供的属性&#xff0c;控制字段的必填、只读、隐…

Spring Cloud 应用 Proxyless Mesh 模式探索与实践

作者&#xff1a;十眠 Service Mesh 简介 Service Mesh 早已不是一个新兴的概念&#xff0c;目前已经有许多关于 Service Mesh 的探索以及实践。 2016 年可以说是 Service Mesh 的元年&#xff0c;Buoyant 公司 CEO William Morgan 率先发布 Linkerd &#xff0c;成为业界首…

Java中的多线程(上)

作者&#xff1a;~小明学编程 文章专栏&#xff1a;JavaEE 格言&#xff1a;热爱编程的&#xff0c;终将被编程所厚爱。 目录 多线程 什么是线程 为什么需要多线程 进程和线程的区别&#xff08;面试重点&#xff09; Java实现多线程 多线程带来的好处 认识Thread类 T…

前端基础_贝塞尔和二次方曲线

贝塞尔和二次方曲线 贝塞尔曲线可以是二次和三次方的形式&#xff0c;常用于绘制复杂而有规律的形状。 绘制贝塞尔曲线主要使用bezierCurveTo方法。该方法可以说是lineTo的曲线版&#xff0c;将从当前坐标点到指定坐标点中间的贝塞尔曲线追加到路径中。该方法的定义如下。 b…

艾美捷耗氧率检测试剂盒说明书及相关研究

细胞内稳态通过ATP的产生来维持。ATP的生成可以通过单独的糖酵解&#xff08;无氧呼吸&#xff09;或通过糖酵解与氧化磷酸化的耦合来完成。氧化磷酸化是氧&#xff08;O2&#xff09;依赖性的&#xff0c;发生在线粒体中&#xff0c;是哺乳动物细胞合成ATP的最有效和优选的方法…

电力系统可视化——比PowerWorld还精彩(Matlab实现)

目录 1 概述 2 PowerWorld 3 案例及Matlab代码实现 3.1 案例 3. 2 结果展现 3.3 Matlab代码实现 1 概述 信息可视化的应用为电力行业带来了巨大的希望&#xff0c;但其潜力尚未被可视化社区充分挖掘。先前关于电力系统可视化的工作仅限于在地理布局之上描绘原始或处理过的…

【数据结构】单链表OJ

目录 一、反转单链表 描述 二、返回链表的中间节点 三、返回倒数第K个节点 描述 示例1 四、合并两个已排序的链表 描述 五、分隔链表 六、判断一个链表是否为回文结构 描述 示例1 示例2 示例3 七、两个链表的第一个公共结点 描述 输入描述&#xff1a; 返回值描…

LICEcap:GIF屏幕录制工具

写博客的时候&#xff0c;我经常会用到需要自制gif的场景&#xff0c;我之前一直使用视频转gif工具处理https://tool.lu/video2gif/&#xff0c;大致就是利用qq录屏成视频&#xff0c;然后通过工具转成gif。 今天无意间看到其他博主用了 LICEcap 工具 LICEcap 是一款简洁易用的…

“隐形贫困者”自学Python做副业,教你如何月入10000+

现在的年轻人总是觉得攒不下钱&#xff0c;虽然表面风光&#xff0c;每天出入高级CBD&#xff0c;可是几乎每个人都是月光族&#xff0c;这一类人被定义为“隐形贫困者”&#xff0c;原因是什么呢&#xff1f;根据小编的分析&#xff0c;现在人们对生活质量要求普遍提高了&…

毕业设计 单片机智能避障超声波跟随小车 - 物联网 嵌入式

文章目录0 前言1 项目背景2 实现效果3 设计原理HC-SR04超声波模块5 部分代码6 最后0 前言 &#x1f525; 这两年开始毕业设计和毕业答辩的要求和难度不断提升&#xff0c;传统的毕设题目缺少创新和亮点&#xff0c;往往达不到毕业答辩的要求&#xff0c;这两年不断有学弟学妹告…

玩转云端 | 数据管理深似海,运维如何变“路人”?

数字技术正在改变人们生产、生活的方方面面。作为数字经济时代的重要生产要素&#xff0c;数据正以指数级别爆发式增长&#xff0c;企业对于数据存储及处理的方式和要求已是“今时不同往日”。最早古人存储数据的方法是“以物记物”或“借物记物”&#xff0c;即用更易于携带的…

如何视频裁剪?建议收藏这几种裁剪视频的方法

现在的网络很是方便&#xff0c;我们可以轻轻松松的在网上找到各种网课视频来进行学习。不过有些网课里面的重点内容不仅比较少&#xff0c;还很分散&#xff0c;让我们很难做到高效的学习。但其实我们可以通过视频裁剪&#xff0c;将有重点内容的视频裁剪下来&#xff0c;这样…

SpringBoot SSMP案例整合二 运维篇

目录 一、程序打包 二、项目打包后 若启动失败 三、虚拟机启动SpringBoot项目&#xff08;Linux&#xff09; 四、临时属性 五、配置文件4级分类 六、自定义配置文件 七、多环境开发&#xff08;yml版本&#xff09; 八、多环境开发多文件版&#xff08;yml版&#xf…

C++ Primer 第四章 表达式

C Primer 第四章 表达式4.1. Fundamentals4.1.1. Lvalues and Rvalues4.1.2. Precedence and Associativity4.2. Arithmetic Operators4.4. Assignment Operators4.5. Increment and Decrement Operators4.9. The sizeof Operator4.10. Comma Operator4.11. Type Conversions4.…