springcloud-02

news2024/11/15 10:10:07

1、微服务概述

1.1 概念

![在这里插入图片描述](https://img-blog.csdnimg.cn/838cb05da66f475c8d3c4d55183f2cd4.png

1.2 架构演进

  • 单体架构:

将业务的所有功能集中在一个项目中年开发, 打成一个jar包
优点:架构简单,部署成本低
缺点:耦合度高

  • 分布式架构

按业务功能对系统进行拆分,每一个业务模块作为独立项目开发,成为一个服务
优点:降低服务耦合,有利于服务升级拓展
缺点:

  • 微服务架构

一种经过良好架构设计的分布式架构方案
在这里插入图片描述

1.3 微服务技术对比

在这里插入图片描述

2. springcloud

2.1 注册中心

2.1.1 eureka集群搭建

  • 依赖
description '微服务'

// 第三方插件对应的仓库和类路径
buildscript {
    ext {
        springBootVersion = '3.0.1'
        springCloudVersion = '2022.0.0'
        springCloudAlibabaVersion = '2021.0.4.0'
    }
    repositories {
        mavenLocal()
        maven { url 'https://maven.aliyun.com/nexus/content/groups/public' }
        google()
        mavenCentral()
    }

    // 此处先引入springboot插件
    dependencies {
        classpath "org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}"
    }
}


allprojects {
    group 'com.xing'
    version '1.0-SNAPSHOT'

    apply plugin: 'java'
    apply plugin: 'idea'
    apply plugin: 'java-library' // 提供api依赖方式支持

    sourceCompatibility = JavaVersion.VERSION_17
    targetCompatibility = JavaVersion.VERSION_17

    tasks.withType(JavaCompile).tap {
        configureEach {
            options.encoding = 'UTF-8'
        }
    }

    // 设置仓库地址
    repositories {
        mavenLocal()
        // aliyun镜像
        maven { url 'https://maven.aliyun.com/repository/public' }
        maven {url 'https://repo.spring.io/milestone'}
        mavenCentral()
    }

    test {
        useJUnitPlatform()
    }
}

subprojects {
    // 使用springboot支持插件
    apply plugin:'org.springframework.boot'
    // 提供dependencyManagement支持
    apply plugin: "io.spring.dependency-management"
    // 相当于maven的dependencyManagement标签
    dependencyManagement{
        imports {
            mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}"
            mavenBom "com.alibaba.cloud:spring-cloud-alibaba-dependencies:${springCloudAlibabaVersion}"
        }
    }

    dependencies {
        // 提供注解处理器
        annotationProcessor 'org.projectlombok:lombok:1.18.24'
        implementation 'org.projectlombok:lombok:1.18.24'
        testAnnotationProcessor 'org.projectlombok:lombok:1.18.24'
        testImplementation 'org.projectlombok:lombok:1.18.24'
        testImplementation 'org.junit.jupiter:junit-jupiter-api:5.9.0'
        testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.9.0'
    }
}

project(':microservice-register'){
    description '注册中心'
    dependencies {
        api 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-server'
    }
}

project(':microservice-register:eureka-server1'){
    dependencies {
        implementation project(':microservice-register')
    }
}

project(':microservice-register:eureka-server2'){
    dependencies {
        implementation project(':microservice-register')
    }
}

project(':microservice-service:microservice-order'){
    description '订单服务'
    dependencies {
        implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-client'
        implementation 'org.springframework.boot:spring-boot-starter-web'
        implementation 'mysql:mysql-connector-java:8.0.31'
        implementation 'com.alibaba:druid-spring-boot-starter:1.2.14'
        implementation 'org.mybatis.spring.boot:mybatis-spring-boot-starter:3.0.0'
    }
}
project(':microservice-service:microservice-user'){
    description '用户服务'
    dependencies {
        implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-client'
        implementation 'org.springframework.boot:spring-boot-starter-web'
        implementation 'mysql:mysql-connector-java:8.0.31'
        implementation 'com.alibaba:druid-spring-boot-starter:1.2.14'
        implementation 'org.mybatis.spring.boot:mybatis-spring-boot-starter:3.0.0'
    }
}
  • 修改hosts文件
127.0.0.1 eureka1
127.0.0.1 eureka2
  • 配置1
server:
  port: 9001
spring:
  application:
    name: eureka-server1
eureka:
  instance:
    hostname: eureka1  #eureka服务端的实例名称
    instance-id: eureka-server1
  client:
    register-with-eureka: true #false表示不向注册中心注册自己
    fetch-registry: true #false表示自己端就是注册中心,我的职责就是维护服务实例,并不需要去检索服务
    service-url:
      defaultZone: http://eureka2:9002/eureka
  • 配置2
server:
  port: 9002
spring:
  application:
    name: eureka-server2
eureka:
  instance:
    hostname: eureka2  #eureka服务端的实例名称
    instance-id: eureka-server2
  client:
    register-with-eureka: true #false表示不向注册中心注册自己
    fetch-registry: true #false表示自己端就是注册中心,我的职责就是维护服务实例,并不需要去检索服务
    service-url:
      defaultZone: http://eureka1:9001/eureka
  • 服务端代码
@SpringBootApplication
@EnableEurekaServer
public class EurekaFirstApp {
    public static void main(String[] args) {
        SpringApplication.run(EurekaFirstApp.class,args);
    }
}


@SpringBootApplication
@EnableEurekaServer
public class EurekaSecondApp {
    public static void main(String[] args) {
        SpringApplication.run(EurekaSecondApp.class,args);
    }
}
  • 客户端配置1
server:
  port: 8001
spring:
  application:
    name: microservice-order
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/db1
    username: root
    password: root
mybatis:
  type-aliases-package: com.xing.model.pojo
  mapper-locations: classpath:/mapper/*Mapper.xml
eureka:
  client:
    register-with-eureka: true
    fetch-registry: true
    service-url:
      defaultZone: http://localhost:9001/eureka
  • 客户端配置2
  port: 8002
spring:
  application:
    name: microservice-user
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/db1
    username: root
    password: root
mybatis:
  type-aliases-package: com.xing.model.pojo
  mapper-locations: classpath:/mapper/*Mapper.xml
  configuration:
    map-underscore-to-camel-case: true
eureka:
  client:
    register-with-eureka: true
    fetch-registry: true
    service-url:
      defaultZone: http://localhost:9002/eureka
  • 客户端代码
@SpringBootApplication
@EnableDiscoveryClient
@MapperScan(value = "com.xing.mapper")
public class OrderApp {
    public static void main(String[] args) {
        SpringApplication.run(OrderApp.class,args);
    }
}


@SpringBootApplication
@EnableDiscoveryClient
@MapperScan(value = "com.xing.mapper")
public class UserApp {
    public static void main(String[] args) {
        SpringApplication.run(UserApp.class,args);
    }
}

2.1.2 nacos项目搭建

  • 导入依赖
description 'springcloud-01'
buildscript {
    ext {
        springBootVersion = '2.7.4'
        springCloudVersion = '2021.0.3'
        springCloudAlibabaVersion = '2021.0.1.0'
    }

    // 配制插件仓库
    repositories {
        mavenLocal()
        maven { url 'https://maven.aliyun.com/nexus/content/groups/public' }
        google()
        mavenCentral()
    }

    // 此处先引入springboot插件
    dependencies {
        classpath "org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}"
    }
}


allprojects {
    group 'com.xingyu'
    version '1.0-SNAPSHOT'

    apply plugin: 'java'
    apply plugin: 'idea'
    apply plugin: 'java-library' // 提供api依赖方式支持

    sourceCompatibility = JavaVersion.VERSION_17
    targetCompatibility = JavaVersion.VERSION_17

    // 设置仓库地址
    repositories {
        mavenLocal()
        // aliyun镜像
        maven { url 'https://maven.aliyun.com/repository/public' }
        maven {url 'https://repo.spring.io/milestone'}
        mavenCentral()
    }

    // 设置公用的依赖
    dependencies {
        // 提供注解处理器
        annotationProcessor 'org.projectlombok:lombok:1.18.24'
        implementation 'org.projectlombok:lombok:1.18.24'
        testAnnotationProcessor 'org.projectlombok:lombok:1.18.24'
        testImplementation 'org.projectlombok:lombok:1.18.24'
        testImplementation 'org.junit.jupiter:junit-jupiter-api:5.9.0'
        testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.9.0'
        // junit5的支持,4不需要
        test {
            useJUnitPlatform()
        }
    }
}

// 配置所有子工程
subprojects {
    // 提供dependencyManagement支持
    apply plugin: "io.spring.dependency-management"

    // 相当于maven的dependencyManagement标签
    dependencyManagement{
        imports {
            mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}"
            mavenBom "com.alibaba.cloud:spring-cloud-alibaba-dependencies:${springCloudAlibabaVersion}"
        }
    }
}

project(":microservice-gateway"){
    description '网关服务'
    apply plugin:'org.springframework.boot'
    dependencies {
        dependencies {
            api ('org.springframework.cloud:spring-cloud-starter-gateway') {
                exclude(module:'org.springframework.boot:spring-boot-starter-web')
            }
            api 'org.springframework.cloud:spring-cloud-starter-bootstrap'
            api 'org.springframework.cloud:spring-cloud-starter-loadbalancer'
            api 'com.alibaba.cloud:spring-cloud-starter-alibaba-nacos-discovery'
            api 'com.alibaba.cloud:spring-cloud-starter-alibaba-nacos-config'
        }
    }
}

project(":microservice-service"){
    description '封装所有的微服务'
    subprojects {
        // 使用springboot支持插件
        apply plugin:'org.springframework.boot'
        dependencies {
            api 'org.springframework.boot:spring-boot-starter-web'
            api 'org.springframework.cloud:spring-cloud-starter-bootstrap'
            api 'org.springframework.cloud:spring-cloud-starter-openfeign'
            api 'com.alibaba.cloud:spring-cloud-starter-alibaba-nacos-discovery'
            api 'com.alibaba.cloud:spring-cloud-starter-alibaba-nacos-config'
        }
    }
}
  • 配置
server:
  port: 8001
  servlet:
    context-path: /microservice-admin
spring:
  application:
    name: microservice-admin
spring:
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
        username: nacos
        password: nacos
      config:
        server-addr: 127.0.0.1:8848
        username: nacos
        password: nacos
  • 代码

@SpringBootApplication
@EnableDiscoveryClient
public class AdminApp {
    public static void main(String[] args) {
        SpringApplication.run(AdminApp.class, args);
    }
}

2.2 远程调用-feign

2.2.1 导入依赖

api 'org.springframework.cloud:spring-cloud-starter-openfeign'

2.2.2 代码

  • 开启feign支持
@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
public class AdminApp {
    public static void main(String[] args) {
        SpringApplication.run(AdminApp.class, args);
    }
}
  • feign接口编写
@FeignClient(value = "microservice-login")
public interface FeignInterface {
    @GetMapping("/microservice-login/loginController/login")
    String login(@RequestParam("userName") String userName);
}
  • 服务提供
@RestController
@RequestMapping("loginController")
public class LoginController {
    @GetMapping("login")
    public String login(@RequestParam("userName") String userName){
        System.out.println(userName);
        return "success";
    }
}

2.3 负载均衡

2.3.1 导入依赖

api 'org.springframework.cloud:spring-cloud-starter-bootstrap' // 提供bootstrap的支持
api 'org.springframework.cloud:spring-cloud-starter-loadbalancer'

2.3.1 代码

@Configuration
// 配置client
@LoadBalancerClients(@LoadBalancerClient(name = "microservice-login",configuration = MyConfig.class))
public class MyConfig {
    @Bean
    @LoadBalanced
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }

    @Bean
    public ReactorLoadBalancer<ServiceInstance> reactorLoadBalancer(Environment environment, LoadBalancerClientFactory factory) {
        String name = environment.getProperty(LoadBalancerClientFactory.PROPERTY_NAME);
        return new RoundRobinLoadBalancer(factory.getLazyProvider(name, ServiceInstanceListSupplier.class), name);
    }
}

2.4 网关gateway

2.4.1 导入依赖

project(":microservice-gateway"){
    description '网关服务'
    apply plugin:'org.springframework.boot'
    dependencies {
        dependencies {
            api ('org.springframework.cloud:spring-cloud-starter-gateway') {
                exclude(module:'org.springframework.boot:spring-boot-starter-web')
            }
            api 'org.springframework.cloud:spring-cloud-starter-bootstrap' // 提供bootstrap的支持
            api 'org.springframework.cloud:spring-cloud-starter-loadbalancer'
            api 'com.alibaba.cloud:spring-cloud-starter-alibaba-nacos-discovery'
            api 'com.alibaba.cloud:spring-cloud-starter-alibaba-nacos-config'
        }
    }
}

2.3.1 代码

server:
  port: 8000
spring:
  application:
    name: microservice-gateway
spring:
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
        username: nacos
        password: nacos
      config:
        server-addr: 127.0.0.1:8848
        username: nacos
        password: nacos
    gateway:
      routes:
        - id: microservice-login
          uri: lb://microservice-login
          predicates:
            - Path=/microservice-login/loginController/**
        - id: microservice-admin
          uri: lb://microservice-admin
          predicates:
            - Path=/microservice-admin/AdminController/**

	
@SpringBootApplication
@EnableDiscoveryClient
public class GateWayApp {
    public static void main(String[] args) {
        SpringApplication.run(GateWayApp.class, args);
    }
}

@Component
public class MyGlobalFilter implements GlobalFilter {
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        System.out.println("MyGlobalFilter running");
        return chain.filter(exchange);
    }
}

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

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

相关文章

如何将项目提交到别人的仓库

大纲&#xff1a; 1、在gitee中克隆(clone)别人仓库的代码。 首先&#xff0c;进入别人的仓库&#xff0c;点击 克隆/下载 2、在你存放项目的文件夹下克隆你刚刚复制的代码 &#xff08;右键点击Git Clone即可&#xff09; 点击OK 就开始克隆了 克隆成功之后&#xff0c;文件上…

【HuggingGPT】Solving AI Tasks with ChatGPT and its Friends in Hugging Face

文章目录 所解决的问题&#xff1f;背景所采用的方法&#xff1f;取得的效果&#xff1f;问题所出版信息&#xff1f;作者信息&#xff1f;参考链接 所解决的问题&#xff1f; 当前的语言模型Large Language Models (LLMs)缺乏处理复杂信息的能力&#xff0c;像视觉&#xff0…

重学Java设计模式-行为型模式-中介者模式

重学Java设计模式-行为型模式-中介者模式 内容摘自&#xff1a;https://bugstack.cn/md/develop/design-pattern/2020-06-27-重学 Java 设计模式《实战中介者模式》.html#重学-java-设计模式-实战中介者模式「按照mybatis原理手写orm框架-给jdbc方式操作数据库增加中介者场景」…

Maven项目中出现【不再支持目标选项 1.5】的解决办法

1 快速解决【单项目】 本方法只适用于单个项目&#xff0c;新建项目使用maven还会出现问题。 在pom.xml配置&#xff1a; <properties><maven.compiler.source>11</maven.compiler.source><maven.compiler.target>11</maven.compiler.target>&l…

高并发高吞吐IO秘密武器——epoll池化技术

1、epoll函数详解 epoll是Linux特有的IO复用函数&#xff0c;使用一组函数来完成任务&#xff0c;而不是单个函数。 epoll把用户关心的文件描述符上的事件放在内核的一个事件表中&#xff0c;不需要像select、poll那样每次调用都要重复传入文件描述符集或事件集。 epoll需要…

闲人闲谈PS之四十一——重新认识PS模块

惯例闲话&#xff1a;4月份参加了SAP咨询大师乐老师组织的公司间业务培训&#xff0c;印象极为深刻&#xff0c;乐老师从三权分立的角度同大家分析了公司间业务交易对象–库存的属地权、管理权、所有权&#xff0c;通过这种全新的视角&#xff0c;把复杂难以理解的公司交易用最…

万字复盘Vue2相关知识(适合学过但忘了然而需要上手的朋友)

目录 前言一&#xff0c;Vue2项目的创建及基本配置1.1 用脚手架创建项目1.2 项目结构1.3 入口文件main.js1.4 组件配置1.4 运行项目 二&#xff0c;Vue的基础知识2.1 数据显示2.2 数据绑定2.3 事件处理2.4 循环遍历2.5 判断语法2.6 计算属性2.7 监视属性 三&#xff0c;重要的生…

python 资料

算法和设计模式 Python实现算法和设计模式 algorithms - Python的一个算法模块. PyPattyrn - 一个用于实现常见设计模式的简单而有效的库. python-patterns - Python中设计模式的集合. sortedcontainers - 快速&#xff0c;纯Python的SortedList&#xff0c;SortedDict和So…

第1章:算法基础【AcWing】

文章目录 快速排序题目描述输入格式输出格式样例样例输入样例输出 提示 算法&#xff08;分治&#xff0c;双指针&#xff09; O ( n l o g n ) O(nlogn) O(nlogn)示例代码注意事项时间复杂度稳定性 归并排序题目描述算法&#xff08;分治&#xff0c;双指针&#xff09; O (…

数据库系统-索引

一、什么是索引 字典中的目录&#xff0c;就是生活中的索引 **索引&#xff1a;**定义在存储表基Table础之上&#xff0c;有助于无需检查所有记录而快速定位所需记录的一种辅助存储结构&#xff0c;由一些列存储在磁盘上的索引项index etries组成&#xff0c;每一个索引项又由…

诊断报文和通讯报文有什么区别?

&#x1f345; 我是蚂蚁小兵&#xff0c;专注于车载诊断领域&#xff0c;尤其擅长于对CANoe工具的使用&#x1f345; 寻找组织 &#xff0c;答疑解惑&#xff0c;摸鱼聊天&#xff0c;博客源码&#xff0c;点击加入&#x1f449;【相亲相爱一家人】&#x1f345; 玩转CANoe&…

YOLOv5+双目实现三维跟踪(python)

YOLOv5双目实现三维跟踪&#xff08;python&#xff09; 1. 目标跟踪2. 测距模块2.1 测距原理2.2 添加测距 3. 细节修改&#xff08;可忽略&#xff09;4. 实验效果 相关链接 1. YOLOV5 双目测距&#xff08;python&#xff09; 2. YOLOV7 双目测距&#xff08;python&#x…

【红队APT】钓鱼篇Office-CVE漏洞RLO隐藏压缩包释放免杀打包捆绑

文章目录 文件后缀-钓鱼伪装-RLO压缩文件-自解压-释放执行Office套件-CVE漏洞-MSF&CSMicrosoft MSDT CVE-2022-30190 代码执行Microsoft MSHTML CVE-2021-40444 远程代码执行CVE-2017-11882 文件后缀-钓鱼伪装-RLO 经过免杀后的exe程序(xgpj.exe)&#xff0c;进行重命名&a…

float,flex和grid布局

页面布局往往会影响着整体的结构与项目的样式&#xff0c;通常我们用的布局方式有三种&#xff1a;float,flex,grid 1.float或position布局 1.1概念 首先对于一个页面来说&#xff0c;有浮动流&#xff0c;文档流&#xff0c;文本流这几种模式&#xff0c;而float布局则是脱离…

接口文档设计的12个注意点

前言 我们做后端开发的,经常需要定义接口文档。 最近在做接口文档评审的时候&#xff0c;发现一个小伙伴定义的出参是个枚举值&#xff0c;但是接口文档没有给出对应具体的枚举值。其实&#xff0c;如何写好接口文档&#xff0c;真的很重要。今天给你带来接口文档设计的12个注…

Camera Tuning - MTK pipeline

MTK ISP Pipeline 模块介绍&#xff1a; BPC&#xff1a;坏点矫正 OBC&#xff1a;OB矫正 FUS&#xff1a;此节点处理后&#xff0c;支持视频、预览HDR Digital Gain&#xff1a; 1、LSC&#xff1a;shading矫正 2、WB&#xff1a;白平衡矫正&#xff08;此步处理后&#xff0…

数字设计笔试Verilog手撕代码 - 累加器

前言 本系列整理关于数字设计的笔试或面试的设计问题&#xff0c;手撕代码继续撕&#xff0c;今天撕一个百度昆仑笔试题的累加器设计。 设计需求 题目来源&#xff1a; 【数字IC/FPGA】百度昆仑芯手撕代码–累加器 已知一个加法器IP&#xff0c;其功能是计算两个数的和&am…

虚幻图文笔记:如何清理Character Creator角色的垃圾数据

书接上文《虚幻图文笔记&#xff1a;Character Creator 4角色通过AutoSetup For Unreal Engine插件导入UE5.1的过程笔记》 在一个项目中我按照上文的步骤导入UE5&#xff0c;但是产生了一些莫名其妙的文件&#xff0c;下面还原一下发现和解决问题的过程。 1. 使用Character Cr…

【C++入门必备知识】

【C入门必备知识】 ①.【命名空间】1.命名空间定义Ⅰ.正常定义命名空间Ⅱ.嵌套定义命名空间Ⅲ.合并命名空间 2.命名空间的使用Ⅰ.命名空间名称及域作用限定符Ⅱ.using成员引入Ⅲ.using namespace名称全部引入 3.注意事项Ⅰ.概念1.全缺省参数2.半缺省参数3.使用规则4.应用场景再…

Baumer工业相机堡盟工业相机如何通过BGAPISDK的软触发实现两相机的同步采集(C#)

Baumer工业相机堡盟工业相机如何通过BGAPISDK的软触发实现两相机的同步采集&#xff08;C#&#xff09; Baumer工业相机Baumer工业相机的高速同步采集的技术背景Baumer工业相机通过BGAPI SDK在回调函数里同步保存图像工业相机在回调函数BufferEvent保存工业相机使用软触发进行同…