谷粒商城第三天-微服务中基本组件的使用

news2024/11/26 4:44:04

目录

一、前言

二、学习的内容

一、Nacos的服务注册/发现

1. 导依赖,nacos-discovery

java.lang.AbstractMethodError: org.springframework.cloud.netflix.ribbon.RibbonLoadBalancerClient.cho

2. 在application.yml中声明nacos服务器的ip地址和端口号,以及指定好服务的名称

3. 在启动类上面加上@EnableDiscoverClient

二、Feign的远程调用

1. 导依赖,open-feign

2. 写好声明式接口

3. 在启动类上面指定好声明式接口的位置

三、Nacos的配置中心

1. 导依赖 nacos-cofig

2. 在配置中心中按照需求进行配置,然后在application.yml文件中声明好nacos服务器的地址和服务名称必要时配好其它参数

3. 注意点

四、GeteWay网关

三、完成的进度

四、总结


一、前言

首先得了解微服务的这一套解决方案可以通过哪些组件进行实现,SpringCloud和SpringCloudAlibaba都是为了解决分布式中所出现的一些问题的,那这两者有什么区别呢,实现就是说SpringCloud是Spring官方的,而SpringCloudAlibaba的阿里巴巴公司的,其实SpringCloud有一些组件其实已经停止维护了,比如Eureka,而且许多组件配置起来很繁琐,不方便,并且没有提供可视化界面不易操作,而SpringCloudAlibaba提供的组件呢,步骤简单,配置容易,并且还有可视化界面,容易直接获取到信息。

微服务的组件很多,什么服务注册,配置中心,网关,服务容错(熔断降级),链路的追踪,远程调用,负载均衡等一些微服务组件,今天主要学习的是在微服务中最为基础的几个组件,分别是使用Nacos的服务注册/发现、Nacos的配置中心、Feign的远程调用、GeteWay网关。

二、学习的内容

首先,使用了Alibaba的这些组件,可以在公共类中导入alibaba的dependencies,导入这个的目的就是为了统一的依赖的版本的控制,就是之后使用alibaba的那些组件就不需要显式的写版本号了。当然也可以不写,不写的话就需要我们对其依赖需要标明其版本号。

dependencies依赖如下:

<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.1.0.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>

 这个只是一个结构的参考,不但是cloud或者是cloudalibaba或者是boot都可以采用这种方式,注意要标明类型为pom然后scope为import。告诉maven这其实不是真正的依赖,只是为了继承的,为了声明好版本号的。具体的这个版本号你要根据boot的版本还有cloud的版本来选择合适的版本。我的boot版本是2.7.12的版本,cloud的版本是我在创建Boot项目的时候自动为我选择的,但是我使用alibaba的组件的依赖的时候,我是没有声明alibaba的dependencies的,所以我在项目中需要自己为依赖手动的显式指定好版本号,但是呢这个版本号,它比较的只能,通过我最初的boot版本idea可以自动的为我适配好alibaba组件的版本。

所以总结来说的话,对于这个依赖:

你最初使用了SpringBoot的初始化器来创建项目的话,在这里你选择了一个boot的版本号。

1. ok那么恭喜你,如果说你在之后使用面板选择的依赖的时候,那些版本号根本就不需要你去操心了,会自动适配的。就比如说我刚刚选择了OpenFeign的依赖,我并没有指定Cloud的版本,但是在创建好项目之后,查看这个pom文件就会发现,它自动的有cloud的dependencies的依赖来进行版本的控制,如下面所示:

<dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

这里啊,我没有在面板中选择有关alibaba的组件,所以啊在pom中也就没有alibaba的dependencies了,一旦我在最开始的时候如果说选择了的话,那么在pom中肯定也会有alibaba的dependencies的来进行版本控制的。 

总结来说:就是得了解初始化器选择了依赖之后的一些动作

2. 如果你最开始啥都没选,不是说真的什么都没选,就是说你每选cloud、cloud-alibaba的组件,那么在之后的pom中也就是干干净净的,也就没有相关的dependencies了。那么就比较的难受,以后你导的任何的一个组件,你就需要指定版本号,其实这样就ok,没问题。当然咯你嘞比较懒并且你怕出错,那你就在最开始的时候加上dependencies,来进行的版本控制。就像最开始老师文档中给出的alibaba的denpencies一样,他就是为了要使用alibaba的组件所以一开始就加上了。

所以总总结:

其实嘞,就是两个:1. 你直接导组件依赖需要指定好版本号 2. 你先导入组件对应的总的dependencies,然后再导入组件的依赖,就可以不指定版本号了

然后就是使用boot的初始化器的话,其实它还是采取的首先加上dependencies的方案,只不过是idea可以自动的为你加上,另外如果选择的boot的初始化器创建项目,即使只选择了boot版本,后续选择组件的时候组件的版本号可以自动适配的。

一、Nacos的服务注册/发现

当然使用nacos之前得在本地机器上安装上nacos,然后开启服务。

如果开启的时候出现了报错,可能是安装的路径有中文。如果直接点击startup命令

 那么就会出现启动服务之后,打开之后,就闪退了。解决办法是使用命令行进行单机启动

startup.cmd -m standalone命令进行启动

使用ip:端口/nacos就能访问可视化界面

步骤:

1. 导依赖,nacos-discovery

因为服务都是需要注册与发现的,所以这个依赖就写在common公共模块中

<!--nacos 服务注册/发现-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
            <exclusions>
                <exclusion>
                    <groupId>org.springframework.cloud</groupId>
                    <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
                </exclusion>
            </exclusions>
            <version>2.2.10-RC1</version>
        </dependency>

 至于为什么要排除ribbon是因为我使用feign远程调用的时候出了问题,出了下面这个报错

java.lang.AbstractMethodError: org.springframework.cloud.netflix.ribbon.RibbonLoadBalancerClient.cho

另外解决这个报错还要导入balance的依赖,这里只要导入就行了,其它不要管

<dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-loadbalancer</artifactId>
            <version>2.2.2.RELEASE</version>
        </dependency>

2. 在application.yml中声明nacos服务器的ip地址和端口号,以及指定好服务的名称

spring:
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848
  application:
    name: gulimall-coupon

3. 在启动类上面加上@EnableDiscoverClient

二、Feign的远程调用

1. 导依赖,open-feign

这个在最初的时候在创建每个服务的时候就选择了,因此就自动导入了

<dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>

2. 写好声明式接口

@FeignClient("gulimall-coupon")
public interface CouponFeign {
    @GetMapping("/coupon/coupon/member/coupon")
    public R memberCoupon();
}

3. 在启动类上面指定好声明式接口的位置

 然后在controller中注入接口对象,就能直接调用了

 

三、Nacos的配置中心

nacos的配置中心是集中配置的,有很多方式。

大致的步骤:

1. 导依赖 nacos-cofig

<!--        nacos统一配置管理-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
            <version>2.2.10-RC1</version>
        </dependency>

2. 在配置中心中按照需求进行配置,然后在application.yml文件中声明好nacos服务器的地址和服务名称必要时配好其它参数

其它参数可以是namespace或者是group等,具体看nacos配置中心中是怎么配的

这里我先简单的说一下几种配置方式:

1. 直接在nacos配置中心中配置一个和服务名同名的配置文件(也就是使用的默认的命名空间)

比如说在nacos配置中心中声明一个member服务的配置

配置了下面的内容:

 

在类路径下写一个bootstrap.properties文件,这个文件的优先级是高于application.properties文件的,所以只要配置中心中有内容那么一定获取到的是配置中心中的内容。

spring.cloud.nacos.config.server-addr=localhost:8848
spring.application.name=gulimall-member

写一个测试接口

 

使用@Value注解就能直接获取到配置文件中的值

另外这里使用@RefreshScope注解来来使得更新配置文件时,也可以获取获取到最新值

注意这里不能动态刷新,是没有加bootstrap依赖的缘故:

 <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-bootstrap</artifactId>
            <version>3.1.5</version>
        </dependency>

2. 在nacos配置中心中直接按照环境进行划分(使用自定义的命名空间)

其它什么依赖,还有测试都一样,就是配置中心发生变化,并且在bootstrap.properties文件中加上相应的配置

配置中心中,先在命名空间那里创建上几个命令空间:

 然后在配置管理中在不同的命名空间中添加上配置:

然后再bootstrap.properties文件中,增添上namespace就行了

 

是用的什么样的环境就配置什么命名空间,命名空间的值可以从配置中心获取

然后就能根据不同的环境,获取到不同环境的配置了。 

3. 按照服务进行划分,然后再根据环境划分(使用自定义的命名空间 + 使用分组)

就是创建服务名的命名空间,然后在这个空间里面创建不同环境的properties文件(使用组来进行区分)

然后在bootstrap.properties文件中,配好namespace和group就行了。

这就表示使用与微服务同名的命名空间中的test组下的配置文件 

4. 对一个服务可以拆解application.yml文件(其实还是第三点只不过现在更细了)

这个简单,就是还是在3的基础上,还是那个命名空间里,选好组,一般就同一个组,然后分别创建好配置文件,比如说数据源的配置文件,MyBatisPlus的配置文件,其它配置文件。就是将原来的application.yml进行拆解。

然后在bootstrap.properties中配置ext-config

spring.cloud.nacos.config.server-addr=localhost:8848
spring.application.name=gulimall-member
spring.cloud.nacos.config.namespace=e43733fe-bb9e-4369-9809-d4030a7fefef


#spring.cloud.nacos.config.group=test

spring.cloud.nacos.config.ext-config[0].data-id=datasource.yml
spring.cloud.nacos.config.ext-config[0].group=dev
spring.cloud.nacos.config.ext-config[0].refresh=true

spring.cloud.nacos.config.ext-config[1].data-id=mybatis.yml
spring.cloud.nacos.config.ext-config[1].group=dev
spring.cloud.nacos.config.ext-config[1].refresh=true

spring.cloud.nacos.config.ext-config[2].data-id=other.yml
spring.cloud.nacos.config.ext-config[2].group=dev
spring.cloud.nacos.config.ext-config[2].refresh=true

3. 注意点

注意:除了这种ext配置,其它在配置中心中的配置文件都是和服务名同名的配置文件,这是规则,只有这样,才能找到配置文件,因为你其实在bootstrap.properties文件中是没有直接配置文件名的,而只是配置了一个命名空间,那到底是怎样找到命名空间中的配置文件的,就是使用服务名去找的,因为bootstrap中配置了服务名,因此可以映射到配置文件。

还有就是第三种方式和第四种是在开发中常用的,可以看作是最佳实践。

四、GeteWay网关

对于网关的话,有很多功能,鉴权、限流、路由都能干。网关其实就是进入微服务前的一道大门。

路由应该是网关的比较重要的功能了,我也只学了路由。

下面我就说一下路由:

路由其实就是找方向,把它引导到哪里去的功能,就是起到一个引导的作用。

路由的话大致就是一个路由的地址,还有断言规则以及过滤器大致就可以描述了。

路由地址就是最终去到的目标地址

断言规则就是如何去到目标地址,符合一定的规则才能去到对于的目标地址。

过滤器就是到达目标路径的时候,可以对请求进行过滤,也就是可以往请求中添加一些东西或者啥的,以及响应回来也可以过滤一遍。

就比如说下面这个例子:

当一个网址的url名称的参数,参数值为baidu时,就跳到百度网站

当参数值为jd时间,就跳到京东网站。

这个断言的规则是需要翻阅文档的,这个例子的断言规则就是

- Query=参数名,参数值

于是路由就这样配:

      routes:
        - id: baidu_route
          uri: https://www.baidu.com
          predicates:
            - Query=url,baidu
        - id: jd_route
          uri: https://www.jd.com
          predicates:
            - Query=url,jd

 然后这个网关本身也是一个服务,所以也得注册到注册中心去。这样才能服务发现其它服务,另外通过注册中心可以查看到其它服务的健康状态,以及进行根据注册中心对各服务信息的获取实现负载均衡,所以说网关的很多功能其实基于注册中心的,所以得把网关注册进去。

注册到注册中心和其它服务注册到注册中心一样就那三步。下面是完整的yml配置:

spring:
  cloud:
    nacos:
      server-addr: localhost:8848
    gateway:
      routes:
        - id: baidu_route
          uri: https://www.baidu.com
          predicates:
            - Query=url,baidu
        - id: jd_route
          uri: https://www.jd.com
          predicates:
            - Query=url,jd
  application:
    name: geteway

三、完成的进度

注册中心、远程调用、配置中心、网关的简单例子都在电脑上面测了一遍。

四、总结

主要是具体几种微服务的组件的实操,知道具体怎样使用。通过实操加深微服务的理解。

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

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

相关文章

MySQL常见问题

优化慢查询 慢查询可能出现的情况&#xff1a; 聚合查询多表查询表数据量过大深度分页查询 表象&#xff1a;页面加载过慢&#xff0c;接口压测响应时间过长&#xff08;超过1s&#xff09; 如何定位慢查询&#xff1f; 方案一&#xff1a;开源工具 可以使用相应的调试工具&a…

数据库SQL查询(一)

本文介绍SQL查询&#xff0c;如何在海量数据中筛选想要数据&#xff1b; 数据库管理系统选择&#xff1a;关系型数据库mysql 数据库管理工具选择&#xff1a;navicat 本文中查询语句和查询案例参考自&#xff1a;https://edu.csdn.net/course/detail/27673?ops_request_mis…

管理类联考——英语——趣味篇——背诵单词

考友方法推荐 词根词缀巧记考研英语大纲词汇 ⼀、词根词缀构词法的威⼒ 《考研英语⼤纲》要求考⽣掌握 5500 个词汇及相关词组&#xff0c;我们将这 5500 个单词&#xff0c;分成了三类&#xff0c;通过第⼀类“3450 基础⾼频词汇”的学习&#xff0c;考⽣夯实了基础&#xf…

Fmoc-保护氨基酸合成中的新型底物:Fmoc-Thr(Ac4Manα1-2Ac3Manα)-OH,CAS:482576-73-8

文章关键词&#xff1a;糖化学试剂&#xff0c;多肽合成&#xff0c;Fmoc-保护氨基酸&#xff0c;糖基化修饰一、产品描述&#xff1a; 西安凯新生物科技有限公司供应的​Fmoc-Thr(Ac4Manα1-2Ac3Manα)-OH&#xff0c;多肽固相合成法&#xff0c;基于Fmoc化学合成&#xff0c…

[学习笔记] [机器学习] 12. [下] HMM 隐马尔可夫算法(马尔科夫链、HMM 三类问题、前后后向算法、维特比算法、鲍姆-韦尔奇算法、API 及实例)

5. 维特比算法解码隐藏状态序列 Q Q Q 学习目标&#xff1a; 知道维特比算法解码隐藏状态序列 Q Q Q 在本篇我们会讨论维特比算法解码隐藏状态序列 Q Q Q&#xff0c;即给定模型 λ \lambda λ 和观测序列 O O O&#xff0c;求给定观测序列 O O O 条件下&#xff0c;最…

使用华为云开发者插件一键部署应用到ECS

前言 笔者是一名码龄5年左右的程序员&#xff0c;大学是能源行业&#xff0c;处于对技术&#xff08;碎银几两&#xff09;的热爱&#xff0c;选择投身搬砖之路。从用C语言在控制台打印第一句“Hello World&#xff01;”开始&#xff0c;笔者陆续接触过C/C、Java、Golang、Py…

STM32 Proteus仿真4x4矩阵15位抢答器数码管TM1637显示-0039

STM32 Proteus仿真4x4矩阵15位抢答器数码管TM1637显示-0039 Proteus仿真小实验&#xff1a; STM32 Proteus仿真4x4矩阵15位抢答器数码管TM1637显示-0039 功能&#xff1a; 硬件组成&#xff1a;STM32F103R6单片机 TM1637驱动4位数码管4x4矩阵键盘蜂鸣器 1.有一个开启键&am…

【Unity Shader】从入门到着魔(1)基本概念:什么是网格?材质?Shader?

文章目录 一、什么是网格(Mesh)?二、什么是MeshFilter(网格过滤器)?三、什么是MeshRenderer(网格渲染器)?四、什么是材质(Material)?五、什么是Shader(着色器)?一、什么是网格(Mesh)? 如上图,模型的三角形面就叫做网格(Mesh),它的本质是一堆顶点数据的规则…

前端基础知识学习——获取dom对象、获取html属性、获取内容、更改样式、创建dom元素、删除元素、代替元素(十)

<!DOCTYPE html> <html lang"en"><head ><meta charset"utf-8" /><title>这是一首离别信</title><script src"https://cdn.staticfile.org/jquery/1.10.2/jquery.min.js"></script></head&g…

Git 基础知识

看版本 git --version 初始化 git init &#xff08;需要在准备建的仓库的目标文件夹根目录下运行&#xff09; 初始化一个仓库供所有其他人一起使用&#xff0c;平时一般都是建好的&#xff0c;个人克隆拉取这个仓库到本地进行编辑。 初始化会产生一个分支叫 master 初…

vue3创建新项目报错:Cannot find module ‘xxx‘

创建vue3项目&#xff0c;命令&#xff1a; 1. 使用vite创建&#xff1a; npm create vitelatest my-vue-app -- --template vue-ts 2.使用vue官方命令&#xff1a; npm init vuelatest 创建vue3模板学习vue3.3的新语法&#xff0c;创建完成后发现文件很多爆红&#xff1a…

华为虚拟化openEuler release 22.03 (LTS-SP1)安装VMTools

华为虚拟化openEuler release 22.03 (LTS-SP1)安装VMTools 环境 虚拟化平台&#xff1a;华为Fusioncompute 6.5.1.SPH6 X86 虚拟机操作系统&#xff1a;openEuler release 22.03 (LTS-SP1) VMTools版本&#xff1a;vmtools-2.5.0.155.tar.bz2 默认vmtools不支持openEuler rele…

【C/C++练习】合并k个已排序的链表

目录 &#x1f43b;题目描述&#xff1a; &#x1f43b;‍❄️思路一&#xff1a;暴力求解法 &#x1f43c;第一步&#xff1a;确定合并后链表的头节点rhead&#x1f43c;第二步&#xff1a;选择次小的进行尾插&#x1f43c;代码实现&#xff1a; &#x1f43b;‍❄️思路二&a…

《C++继承》

本文主要介绍继承的相关知识 文章目录 思维导图一、继承的概念及定义1.继承的概念2.继承的定义2.1 定义格式2.2 继承关系和访问限定符2.3 继承基类成员访问方式的变化 二、基类和派生类对象的赋值转换三、继承中的作用域四、派生类的默认成员函数五、继承与友元六、继承与静态成…

Vue中的Ajax 配置代理 slot插槽

4.1.Vue脚手架配置代理 本案例需要下载axios库npm install axios 配置参考文档Vue-Cli devServer.proxy vue.config.js 是一个可选的配置文件&#xff0c;如果项目的 (和 package.json 同级的) 根目录中存在这个文件&#xff0c;那么它会被 vue/cli-service 自动加载。你也可…

【OJ比赛日历】快周末了,不来一场比赛吗? #06.17-06.23 #13场

CompHub[1] 实时聚合多平台的数据类(Kaggle、天池…)和OJ类(Leetcode、牛客…&#xff09;比赛。本账号会推送最新的比赛消息&#xff0c;欢迎关注&#xff01; 以下信息仅供参考&#xff0c;以比赛官网为准 目录 2023-06-17&#xff08;周六&#xff09; #2场比赛2023-06-18…

使用matplotlib制作动态图

使用matplotlib制作动态图 一、简介二、模块简介1. **FuncAnimation**类介绍2. 定义动画更新函数 三、使用matplotlib制作动画1.一步法制作动态图片2. 两步法制作动态图片 一、简介 matplotlib(https://matplotlib.org/)是一个著名的python绘图库&#xff0c;由于其灵活强大的…

【Qt】使用libmodbus

这里写目录标题 下载编译使用Demo参照&#xff1a; Qt自带QModbusTcpClient&#xff0c;换个电脑就不好使了&#xff0c;换libmodbus 下载 可以去github下载 链接: https://pan.baidu.com/s/13lgEZ59Dt5M7zmTJNpfKvg?pwdyzfm 提取码: yzfm 下载libmodbus 并解压 编译 进入…

20分钟做一套采购审批系统

1、设计输入模板 excel画表格界面 # 公式代表新建时以默认值代替 2、设置单元格为签名控件 双击单元格后&#xff0c;会默认显示当前用户的信息,用于签名 3、设置要合计的数据 生成的合计公式会默认放到下一行 4、设置单元格的ID与标题&#xff0c;在添加或者删除行或者列时&am…

影像组学技术的基础和应用

一、概述 1. 影像组学足迹史 2003年&#xff0c;Mark A. Kriegsman和Randy L. Buckner发表的关于视觉系统空间组织的研究文章The genetic and functional basis of the spatial organization of the visual system&#xff0c;为影像组学领域提供了先驱性思路&#xff0c;奠定…