从零开始搭建一个微服务项目(一)

news2024/11/14 14:43:46

文章目录

    • Nacos搭建
      • 一. 安装nacos
      • 二.创建项目导入依赖
      • 三. 进行配置
      • 四.引入Feign远程调用
      • 五.引入RIbbon负载均衡
      • 六.Nacos配置中心

Nacos搭建

一. 安装nacos

我安装的是window版,可参照该教程nacos安装教程

二.创建项目导入依赖

  1. 首先我们先创建一个主工程。
    引入如下依赖(因为spring-clound不同版本需要的springboot版本不同,所以下面会将版本号带上)
    springboot版本使用的是2.2.5.RELEASE
<dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>2.2.1.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>

            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Hoxton.SR6</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
  1. 再主工程下创建一个common公共子工程,创建一个空的maven项目,引入如下依赖
<dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>

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

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

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

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

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

        <dependency>
            <groupId>org.apache.httpcomponents</groupId>
            <artifactId>httpclient</artifactId>
            <version>4.5.3</version>
        </dependency>

        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-core</artifactId>
            <version>2.11.1</version>

        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-annotations</artifactId>
            <version>2.11.1</version>
        </dependency>
        <!-- nacos依赖 -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        </dependency>
        <!-- feign依赖 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
            <version>2.1.3.RELEASE</version>
        </dependency>
    </dependencies>
  1. 主工程下创建对应的生产者消费者的springboot工程,并引入自建Common依赖
    目录结构如下
    在这里插入图片描述

三. 进行配置

对应的服务,需要注册在Nacos注册中心里。所以在application中进行配置。
在生产者和消费者中都加入该配置

#nacos配置 采用分级存储模型,将同一个机房中的实例化为一个集群
spring:
  cloud:
    nacos:
      server-addr: xxx.xx.xx.xxx:8848
      discovery:
        cluster-name: SZ
  application:
    name: publisher

并在消费者的启动类上添加 @EnableDiscoveryClient注解
至此配置就完成了。

四.引入Feign远程调用

各个服务之间是通过Http请求来进行交互,原先使用RestTemplate进行请求,可以使用更方便的openFeign(Feign已经停止维护,可以看此篇文章)

  1. 引入依赖放到common包下

  2. 进行配置 feign底层用的HttpUrlConnect进行发送请求,可以更换为Okhttp,效率更高

    feign:
      client:
        config:
          default:
            connectTimeout: 5000
            readTimeout: 5000
            loggerLevel: basic
      okhttp:
        enabled: true
      hystrix:
        enabled: true
    
  3. 开启Fegin 在springboot启动类上添加 @EnableFeignClients

  4. 发送请求。在消费者服务里建一个接口,写上需要调用的请求,并在接口上添加@FeignClient(name = "publisher" ,path="/order")
    name为请求服务的服务名,path为路径前缀

    @FeignClient(name = "publisher" ,path="/order")
    public interface OrderFegin {
        @RequestMapping("/test/all")
        Object allOrders();
        @RequestMapping("/test/getOrder/{id}")
        Object getOrder(@PathVariable("id") String id);
    }
    

    在colntroller中注入Feign接口,便可使用

    @RestController
    @RequestMapping("/order")
    public class OrderController {
        @Autowired
        private OrderFegin orderFegin;
    
        @RequestMapping("/all")
        public Object getAllOrder(){
            HashMap<String, Object> map = new HashMap<>();
            map.put("order",orderFegin.allOrders());
            return map;
        }
    
        @RequestMapping("/all/{id}")
        public Object getAllOrder(@PathVariable("id") String id){
            HashMap<String, Object> map = new HashMap<>();
            map.put("order",orderFegin.getOrder(id));
            return map;
        }
    }
    

原理:通过指定的服务名,去注册中心查找对应的ip地址,然后去向目标发送请求

五.引入RIbbon负载均衡

  1. nacos默认引入了RIbbon
    默认使用ZoneAvoidanceRule(ribbon默认的轮序规则,分集群,但并不能实现根据同集群优先来实现负载均衡)
    可以自定义使用哪一个规则,推荐使用NacosRule,可以同集群优先

    	  @Bean
          public IRule iRule(){
              return new NacosRule();
          }
    

    如何配置属于哪个集群

    #nacos配置 采用分级存储模型,将同一个机房中的实例化为一个集群
    spring:
      cloud:
        nacos:
          server-addr: 172.30.61.51:8848
          discovery:
            cluster-name: SZ #集群配置
    
  2. RIbbon原理
    通过服务名在数据中心找到多个ip,然后通过负载均衡策略(可以通过实现Irlue来实现),来制定对应的实例ip。
    在这里插入图片描述

六.Nacos配置中心

  1. 服务启动时会先通过bootstrap拿到nacos地址,再去nacos去对应的配置。配置中心的配置大于本地的配置。

在这里插入图片描述
2. 如何通过bootstrap拿到nacos对应的配置呢,会通过服务名+profile名+后缀名组成。(nacos中没有profile名,则对该服务所有环境都生效)

spring:
  application:
    name: publisher # 服务名称
  profiles:
    active: dev #开发环境,这里是dev
  cloud:
    nacos:
      server-addr: 172.30.61.51:8848 # Nacos地址
      config:
        file-extension: yaml # 文件后缀名
        extension-configs: #多个微服务公用的配置文件
          - data-id: common.yaml
  1. 如何实现配置的热更新呢?
    可以通过 @RefreshScope 或者 @ConfigurationProperties 来实现

  2. 还支持在nacos中设置优先级(1最大,0用不使用)
    在这里插入图片描述

参考大佬博客

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

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

相关文章

透明窗体和控件

调用函数设置窗体透明度&#xff1a; setWindowOpacity(x); x(0-1)可以为小数 0.1 0.2 0.3等 x0 时完全透明k1时不透明setWindowOpacity(0.5); 当有控件时&#xff0c;控件也变透明&#xff0c;在ui界面中添加两个按钮 使窗体透明但控件不透明 setWindowFlag&#xff08;Qt:…

【MQ工作队列模式】

1、模式介绍 ⚫Work Queues&#xff1a;与入门程序的简单模式相比&#xff0c;多了一个或一些消费端&#xff0c; 多个消费端共同消费同一个队列中的消息。 ⚫ 应用场景&#xff1a;对于任务过重或任务较多情况使用工作队列可以提高任务处 理的速度。 小结: 1、在一个队列中如果…

初学Nodejs(3):http模块

初学Nodejs http模块 1、概念 什么是客户端与服务端 在网络节点中&#xff0c;负责消费资源的电脑&#xff0c;叫做客户端&#xff1b;负责对外提供网络资源的电脑叫做服务器 http模块是Nodejs官方提供的、用来创建web服务器的模块。通过http模块提供的http.createServe()方…

[附源码]java毕业设计流浪动物救助系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

活动sql语句索引基本优化

前言 最近接到了一个需求开发&#xff0c;然后开发完成以后打算对sql进行一些优化&#xff0c;于是等所有功能开发完成以后对mapper文件里面的sql,和service层的查询语句都摘出来&#xff0c;然后设计了一些索引&#xff0c;下面就来说说一些大概的优化思路&#xff0c;至于mys…

WPF上位机通信组件与Modbus协议

1、Modbus通信方式与分类 - 串口 RS485&#xff08;一主多从&#xff09;&#xff1a;不同的报文格式&#xff1a;ModbusAscii&#xff08;ASCII字符方式进行发送&#xff09;、ModbusRTU&#xff08;Remote Terminal Unit&#xff09; - 以太网&#xff08;TCP点对点&#…

[博士后申请]套磁信的五大误区

博士后申请有一些技巧需要注意&#xff0c;下面就随知识人网一起来看看博士后申请套磁信的五大误区。 误区一&#xff1a;字数越多越好 Email字数控制在200字左右。教授每天处理上百封邮件&#xff0c;简单明了的邮件内容是为别人节约时间的一种礼貌;简短易回复的信件也会加大…

supervisor常见报错问题处理及使用教程

Supervisor 是用Python开发的一套通用的进程管理程序&#xff0c;能将一个普通的命令行进程变为后台daemon&#xff0c;并监控进程状态&#xff0c;异常退出时能自动重启。 官网介绍 Supervisor已经过测试&#xff0c;可以在Linux&#xff08;Ubuntu 9.10&#xff09;&#xf…

MySql常见复合查询(重点)

复合查询&#xff08;重点&#xff09; 多表查询 实际开发中往往数据来自不同的表&#xff0c;所以需要多表查询。本节我们用一个简单的公司管理系统&#xff0c;有三张表 EMP,DEPT,SALGRADE来演示如何进行多表查询。 显示雇员名、雇员工资以及所在部门的名字因为上面的数据来…

如何解决Web前端安全问题?

我国网络技术水平的提升&#xff0c;带动着WEB前端业务量的显著增长&#xff0c;人们对于网络服务的需求也日益复杂&#xff0c;与此同时&#xff0c;越来越多的黑客出现&#xff0c;其攻击水平也有了明显提升&#xff0c;WEB前端也成为了众多黑客进行网络攻击的主要目标。 因…

什么是零代码?零代码与低代码有什么联系与区别?

传统的软件研发方式目前并不能很好地满足企业的需求&#xff1a;人员成本高、研发时间长、运维复杂。 这时零代码或低代码工具出现在市面上并被关注就是必然趋势了。对于不太了解两者的人来说&#xff0c;零代码和低代码是什么&#xff1f;又有什么联系与区别&#xff1f; 01 …

uni小程序——评论、文本域、发送、键盘调起、有值后按钮变色等

一、简介 文本域默认显示一行&#xff0c;最多显示4行&#xff0c;到了4行之后不再增高。 输入值后按钮变色 二、案例演示 三、代码 <template><view><view class"plBox"><textarea auto-height"true" maxlength"-1" :s…

[Linux安装软件详解系列]04 安装Redis

目录1、查看服务器是否已安装Redis2、安装Redis1&#xff09;下载2&#xff09;解压3&#xff09;安装4&#xff09;移动配置文件到安装目录下5&#xff09;配置redis为后台启动6&#xff09;将redis-cli&#xff0c;redis-server拷贝到bin下7&#xff09;启动redis8&#xff0…

RabbitMQ简介及在Linux中安装部署(yum)

一、RabbitMQ简介及其作用 RabbitMQ简介 RabbitMQ是在2007 年发布&#xff0c;是一个在 AMQP(高级消息队列协议)基础上完成的&#xff0c;可复用的企业消息系统&#xff0c;是当前最主流的消息中间件之一。RabbitMQ是一个由erlang开发的AMQP&#xff08;Advanced Message Queu…

Arcpy入门教程01:从零开始制作一个arcpy脚本

从零开始制作一个arcpy脚本 文章目录 需求分析代码实现构造临时工作目录数据处理过程及API解析脚本打包代码封装在红盒子中创建脚本报错提醒 EOL while scanning string literal完整代码需求分析 我们现在有一个GDB存储这西安市各个区的绿地面的GDB,以及碑林区和新城区的行政…

将时间序列转成图像——相对位置矩阵方法 Matlab实现

目录 1 方法 2 Matlab代码实现 3.结果 【若觉文章质量良好且有用&#xff0c;请别忘了点赞收藏加关注&#xff0c;这将是我继续分享的动力&#xff0c;万分感谢&#xff01;】 其他&#xff1a; 1.时间序列转二维图像方法及其应用研究综述_vm-1215的博客-CSDN博客 2.将时…

Nginx实现负载均衡

目录 一、环境准备 1、准备3台centos服务器 2、软件安装 二、负载均衡配置 三、其他分配策略 1、fair&#xff08;第三方&#xff09; 一、环境准备 1、准备3台centos服务器​​​​​​​ 服务器名称主机名IP安装服务备注Nginx反向代理服务器proxy192.168.1.10nginx关…

ES倒排序索引

前言 在学习Elasticsearch的使用前&#xff0c;我们先来了解下es是如何实现全文搜索的。 倒排索引是 Elasticsearch 中非常 重要的索引结构&#xff0c;从 文档单词到文档 ID 的过程 为什么要使用倒排索引 先看下面的商品数据goods id 标题 描述 1 小米手机 小米手机性…

【保姆级】新机器部署Redis

1、登录服务器&#xff0c;如果非root用户则切root用户 sudo su - 2、安装gcc yum install gcc-c 3、在/usr/tmp目录上传redis安装包 4、将安装包移到/opt/byd目录 mv redis-4.0.11.tar.gz /opt/byd 5、解压 & 重命名 tar -xzvf redis-4.0.11.tar.gz mv redis-4.0.11 …

安全狗受邀出席CIS 2022网络安全创新大会

11月16日&#xff0c;由网络安全行业门户Freebuf主办的CIS 2022网络安全创新大会&#xff08;简称CIS&#xff09;在上海主会场顺利开幕。 作为国内云原生安全领导厂商&#xff0c;安全狗也收到邀请出席此次活动。 据悉&#xff0c;此次大会分为上海、北京、深圳等多个会场&am…