Spring Cloud微服务之eureka+client入门

news2024/11/15 13:54:50

Spring Cloud微服务之eureka+client入门

谈到服务,想到一种“懒人思维”。家政服务为懒人收拾家务提供一种便利,快餐服务为不爱做饭的懒人提供一种方便.....等等。

说到微服务,顾名思义,就是把服务再细微化。比如需要送女友一束花表达情意,又不想自己去花店,去花店又不想等,这里面就有了定花服务,包花服务,送花服务等,如下图所示。

 

对于这样的一个流程服务,如果需要一种架构为开发的,可以有以下三种架构形式。

一、由架构形式谈到微服务

1、完成这个逻辑可以使用单体架构

单体架构:将整个定花、包花和送花涉及的业务所有功能集中在一个项目中开发,比如这里就包含了定花模块、包花模块、送花模块等等,这个程序在部署时就是一个进程,比如就把一个war包部署到tomcat中。

 

这种架构会有一些问题:

(1)所有业务的功能模块都聚集在一起,如果代码量多,可能在定花,包花,送花代码实现过程中有共同的代码,不同业务的需求开发同时进行的时候,维护起来有点麻烦

(2)由于是单体,对请求的并发量,有限制,一个tomcat,并发量千级左右

(3)由于代码都堆在了一起,部署起来慢

(4)后期再进行扩展,成本会很高,假设需要替换更加爽一点的内存以及高效的磁盘。但在这种单体架构上 无法针对单个功能模块进行扩展。

(7)前后端不分离,后端开发人员可能要具备相应的前端知识

2、使用这个逻辑可以使用分布式构架

分布式架构:根据整个定花、包花和送花涉及的业务功能对系统做拆分,每个业务成为一种服务,定花成为定花服务,包花成为包花服务,送花成为送花服务。不同的服务分布在不同的服务器节点,共同构成的系统称为分布式系统,这些服务器可能放在不同的机柜中,也可能在不同的机房中,甚至分布在不同的城市。在空间部署上是可以随意分布的。如下图所示。

 

这里要注意区分出分布式和集群的区别,分布式在于多个服务器做不同的事情,单纯谈集群只是多台服务器完成相同的几种服务。

集群原理图如下。

 

集群架构只是改善了,单体架构的单点故障问题和提高请求的并发数

而对分布式结构来说,虽然服务已经分开,降低服务耦合,但服务拆分的粒度如何去界定,服务之间调用如何更好的管理也会发生问题。需要制定一套行之有效的标准来约束分布式架构。

3、完成这个逻辑使用微服务。

微服务拆分粒度会更小,每一个服务都对应唯一的业务能力,做到单一职责。采取自治的特点,团队独立、技术独立、数据独立、独立部署和交付,服务提供统一标准的接口,与语言和技术无关,尤其是网络的容错性方面,由于网络之间需要通信,一旦节点出现故障,就会出现重发或者失败的信息,服务调用能够做好隔离、容错、降级,避免出现级联问题。

 

图中所显示的可能也只是定花、包花、送花三个服务微服务中的冰山一角,还可以有微信订花,公众号订花,定制包花,定点送花等等,包括订花失败服务,包花异常服务,送花异常服务等等,在微服务的细微颗粒化中,只有想不到的服务,没有完善不了的服务。这样的一个一个的小服务就是微服务。

其实微服务就是在给分布式架构定制一个标准,进一步降低服务之间的耦合度,提供服务的独立性和灵活性。做到高内聚,低耦合。

因此,我们可以认为微服务是一种经过良好架构设计的分布式架构方案。

Spring cloud具备了微服务框架结构。

二、spring cloud

Spring Cloud是一系列框架的有序集合。其利用了Spring Boot的开发便利性巧妙地应用了分布式系统基础设施的开发,如服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等,都可以用Spring Boot的开发风格做到一键启动和部署。

微服实际就是业务垂直拆分的再次拆分,划分的服务粒度更细。

其优点在于: 每个子项目功能单一,结构清晰,代码易维护。同时错误大量减少,出现BUG几率也小,开发效率高,代码量小,数据库分开随之带来数据库访问压力急剧降低。

其也有一定的缺点: 系统多了,系统之间调用变复杂,代码跨网络需要转换成二进制字节流,就涉及到序列化和反序列化,这样耗费时间长,####如果网络不稳定也会影响程序的稳定性。

三、微服务架构图

微服务在架构上需要有注册中心,通过注册中心注册服务,有统一的网关路由,也可以跟踪链路......等,具体需要的结构组件如下图所示。

 

在这几个结构组件中,能够通过注册中心注册,统一配置来进行协调工作,具体组件流程框架如下图所示。

 

图中 涉及到Eureka注册中心,服务提供者,业务消费者,Ribbon负载均衡(类似nginx的功能),Feign REST封装, Hystrix 断路器,Zuul API网关, SpringCloudConfig配置中心,数据存在Git,版本控制

Eureka注册中心,服务提供者和服务消费者之间协调工作如下:

1.注册中心 : Eureka server, 负责"保存"的服务(服务指的service子级项目的controller配置路径)

2.生产者: Eureka Client, 负责将服务发送到注册中心,由注册中心负责保存.

3.消费者: Eureka Client, 作用: 用户就是消费者,在客户端输入访问地址(地址服务),如果在注册中心由服务,就去访问,

4.如果在注册中心没有改服务,就报404

注册中心, 生产者, 消费者 三者之间的关系总结起来通过心跳机制来管理服务,如下图所示。

 

注意它的特点,结构类似于消息队列,不管是服务提供者还是服务消费者都注册到注册中心。而且不会每次都去注册中心获取,而是有本地缓存,加快访问性能。内部含有心跳机制,当注册中心信息改变,自动快速获取新的信息到本地。心跳机制还保证分布式环境下,某个服务失败后,自动列表从注册中心移除。注册中心中保证所有可用的链接。

同时,还要注意分布式系统中最核心最重要的理论有一个CAP原则,CAP原则又称CAP定理,指的是在一个分布式系统中,Consistency(一致性)、 Availability(可用性)、Partition tolerance(分区容错性),三者不可得兼。

如下图所示。

 

图中Consistency表示一致性,表示所有客户端总是展现同样的数据。
图中Avaliability表示可用性,表示每个客户端总是能读写。
图中Partition Tolerance表示分区容错性,表示当集群中的某些节点无法联系时,仍然能正常提供服务。
图中CA是一致性和可用性的统一,表示有一致性和可用性的系统,通常可扩展性能不高,不具备分区容错性,如传统的关系数据库。
图中CP是一致性和分区容错性统一,表示为满足一致性,在系统分区期间会停止服务,直到数据恢复。
图中AP是可用性和分区容错性的统一,表示通常注重系统性能和扩展性,而非强调一致性。

图中所示的分布式系统的CAP理论,这个理论首先把分布式系统中的三个特性进行了如下归纳:

一致性说明在分布式系统中的所有数据备份,在同一时刻是否同样的值,等同于所有节点访问同一份最新的数据副本。

可用性说明在集群中一部分节点故障后,集群整体是否还能响应客户端的读写请求,等同于对数据更新具备高可用性。

分区容错性说明以实际效果而言,分区相当于对通信的时限要求。系统如果不能在时限内达成数据一致性,就意味着发生了分区的情况,必须就当前操作在C和A之间做出选择。

前面是理论,后面是实践,光说不练,假把式。

下面进入微服务服务端和客户端入门的初步。

四、微服务EurekaServer的建立

1、点击File--->New---->Project.....,如下图。

 

2、在弹出的地话框中,左边点击Spring Initializr,表示Spring的初始程序,右边在默认的地方可能会初始化失败,需要选择自定义的地址:http://start.aliyun.com。如右图所示。

 

3、在接下来的弹出框中输入spring cloud项目名称的Group和artifactId。如下图所示。

 

4、点击Next进入下一步,左边先点击Web,右边点击Spring web可以建立Web应用程序。如下图。

5、继续在这个对话框中,左边点击Spring Cloud Discovery,右边点击Eureka Server,如下图所示。

6、然后点击Next进入到“下一步”,会出现对话框。如下图所示。

7、在出现的对话框中,点击Finish后完成项目的构建向导。

项目框架建立后,修改主程序中的主类,如下图所示。

8、在打开的主程序中,加入注解@EnableEurekaServer。

eurekaserver的程序代码如下。

package com.myfirsteurekabalance.myfirsteurekabalance;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
@SpringBootApplication
@EnableEurekaServer
public class MyfirsteurekabalanceApplication {

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

}

9、下面需要编辑resources下面的application.yml文件,在原来的resouces目录下只有application.properties,需要把application.properties改成application.yml。然后编辑该文件。

10、application.yml的文件内容如下。

# 应用名称
spring:
  application:
    name: myfirsteurekabalance
# 应用服务 WEB 访问端口
server:
  port: 8011
eureka:
  client:
    register-with-eureka: true
    fetch-registry: false
    service-url:
      defaultZone: http://localhost:8011/eureka
  instance:
    hostname: myprovider1

其文件内容的解释如下图.

二、Eureka客户端的搭建

1、同样点击File--->New----->Project....,如下图所示。

 

2、在打开的对话框中,左边继续点击Spring Initializr,表示Spring的初始程序,右边在默认的地方可能会初始化失败,需要选择自定义的地址:http://start.aliyun.com。如下图所示。

 

3、点击Next,然后在出现的对话框中输入项目名称。如下图所示。

 

4、在接下来出现的对话框中,左边选择Web,右边选择Spring Web。如下图所示。

 

5、继续在这个对话框中,左边选择Spring Cloud Discovery,右边选择Eureka Discovery Client。如下图所示。

 

6、然后点击下一步即Next,在出现的对话框中直接点击Finish完成项目建立的向导。如下图所示。

 

在主程序中输入EnableEurekeClient或者是@EnableDiscoveryClient都可以实现Eureka客户端的发现。

客户端的代码如下。

package com.myfirsteurekaclient01.myfirsteurekaclient01;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;

@SpringBootApplication
@EnableEurekaClient
public class Myfirsteurekaclient01Application {

    public static void main(String[] args) {

        SpringApplication.run(Myfirsteurekaclient01Application.class, args);
    }

}

现在可以做一个controller的package包,然后定义一个RestController的控制器。代码如下。

package com.myfirsteurekaclient01.myfirsteurekaclient01.controller;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
@RestController
public class PageController {
    @GetMapping("/hello/{name}")
    public String hello(@PathVariable("name")String name){
        return "hello,"+name;
    }
}

现在再次修改application.yml文件。如下图所示。

然后,application.yml的具体内容如下所示。

# 应用名称
spring:
    application:
      name: myfirsteurekaclient01
# 应用服务 WEB 访问端口
server:
  port: 8008
eureka:
  client:
    service-url:
      defaultZone: http://localhost:8011/eureka

其内容的大体解释如下。

 

现在可以先运行EurekaServer的程序,然后再运行客户端的主程序。

注册中心的访问http://localhost:8011,效果如下。

 

客户端启动后,可以访顺具体的请求地址,http://localhost:8080/hello/lili。访问效果如下图。

 

这时,客户端启动成功。

欢迎继续关注博客,后续带来微服务其他组件。

码云地址:

https://gitee.com/who_moved_my_cigarette/spring_cloud_server_client_Intruduction/tree/master/

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

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

相关文章

FastReport Desktop 2023Microsoft SQL存储过程的支持

FastReport Desktop 2023Microsoft SQL存储过程的支持 添加了用于从JasperReports转换报告的模板。 添加了对连接到Microsoft SQL存储过程的支持。 在RTF中,添加了一项设置,以提高打印时的图像质量。 添加了导出到Microsoft Excel 2007时从“货币”转换为…

Landsat数据下载

Landsat数据下载步骤0 Landsat数据介绍1 下载地址2 下载步骤2.1 检索数据2.1.1 设置地点,有多种方法2.1.2 选择时间范围2.1.3 在Data Sets界面选择传感器(卫星或者传感器的名称)2.2 限定云量2.3 下载数据这是个老生常谈的话题了,我…

[附源码]Python计算机毕业设计Django校园快递柜存取件系统

项目运行 环境配置: Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术: django python Vue 等等组成,B/S模式 pychram管理等等。 环境需要 1.运行环境:最好是python3.7.7,…

ubuntu上msquic带根证书的测试使用

ubuntu上msquic带根证书的测试使用 1.证书1.1 根证书的生成1.2 根证书的导入1.4 openssl验证书1.5 修改/etc/hosts2. msquic编译2.1 quic协议编译2.2 示例程序编3.本地测试1.证书 1.1 根证书的生成 假设我们的域名为: www.contoso.com 创建CA私钥 openssl ecparam -out cont…

java Object类 包装类

目录 Object 类的使用 操作符与equals方法  : equals() 重写equals()方法的原则 面试题 toString() 方法 包装类(Wrapper)的使用 基本类型、包装类与String类间的转换 包装类用法举例 总结 Object 类的使用  Object类是所有Java类的根父类  如果…

最新出炉的U-Net研究性综述:Medical Image Segmentation Review: The Success of U-Net

热乎的Medical Segmentation 综述1 文章介绍2 前言3 U-Net变型4 Skip Connection Enhancements4.1 Increasing the Number of Skip Connections4.2 Processing Feature Maps within the Skip Connections4.3 Combination of Encoder and Decoder Feature Maps5 Backbone Design…

每天一个面试题:四种引用,弱引用防止内存泄漏(12.7.2022)

每天一个面试题:四种引用四种引用基本介绍实例Demo- 虚引用弱引用防止内存泄漏弱引用Debug分析源码开始全新的学习,沉淀才会有产出,一步一脚印! 面试题系列搞起来,这个专栏并非单纯的八股文,我会在技术底层…

配对交易之统计套利配对:协整(cointegration)

Engle和Granger观察到了一个相当有趣的现象。尽管两个时间序列是非平稳的,但在某些情况下,两者的特定线性组合实际上是平稳的;也就是说,这两个序列在某种程度上是步调一致的。Engle和Granger创造了“协整”(cointegrat…

【Tensorflow+自然语言处理+LSTM】搭建智能聊天客服机器人实战(附源码、数据集和演示 超详细)

需要源码和数据集请点赞关注收藏后评论区留言私信~~~ 一、自然语言处理与智能 自然语言处理技术是智能客服应用的基础,在自然语言处理过程中,首先需要进行分词处理,这个过程通常基于统计学理论,分词的精细化可以提升智能客服的语…

小白课程,前端入门新手,必须了解的回调函数概念和应用实例

******内容预警******新手内容,大佬请绕道 做为一个纯纯的小白,我相信很多人是没有回掉函数这个概念的,虽然很多文档和教程中都有提到,但是很多人看完文档也不会用。因为菜鸟的开发任务,都是简单画一下html页面&#x…

分布式定时调度:xxl-job 最佳实践详解

文章目录一、定时任务概述1.1. 什么是定时任务1.2. 常见定时任务方案1.3. 分布式定时任务面临的问题1.4. 分布式定时任务xxl-job二、xxl-job架构设计2.1. 设计思想2.2. 架构设计图三、xxl-job安装3.1.下载源码3.2. 导入数据库3.3. 启动调度中心3.4. 配置部署“执行器项目3.5. 案…

护眼灯有用吗?双十二买什么样的护眼灯真的有效果

对于很多人来说,健康是一个越来越重视的话题,特别是现代社会生活节奏很快,很多人的眼睛都吃不消,所以不管是为了好看,还是为了能够看得足够远,都会注意保护眼睛,所以越来越多的人开始考虑护眼台…

网站变灰,6行代码,通通变灰

人狠话不多,直接上代码 -webkit-filter: grayscale(100%); -moz-filter: grayscale(100%); -ms-filter: grayscale(100%); -o-filter: grayscale(100%); filter: grayscale(100%); filter: progid:DXImageTransform.Microsoft.BasicImage(grayscale1); 通通变灰&…

Java中Map集合体系的基本使用和常用API

文章目录Map集合体系Map集合概述和使用Map集合体系的特点Map集合常用的APIMap集合体系 Map集合概述和使用 Map集合是一种双列集合,每个元素包含两个数据。 Map集合的每个元素的格式:keyvalue(键值对元素)。 Map集合也被称为“键值对集合”。 Map集合整体…

本地代码上传到gitlab

1、在本地代码目录中,鼠标右键Git Bash Here,会打开一个git命令操作窗口; 2、执行git init命令,此命令会在当前目录下创建一个.git文件夹, git init 3、将项目的所有文件添加到仓库中, git add -A 4、将add的文件…

【计算机毕业设计】75.教师工作考核绩效管理系统源码

一、系统截图(需要演示视频可以私聊) 摘 要 随着社会不断进步与发展,生活节奏不断加快,信息已经成为我们生活中不可缺少的一部分,很多学校需要掌握大量的信息来了解特定学生的需求,传统的做法是组织大量的…

如何实现table表头固定但是tbody可以滚动【附源码实例】

【写在前面】经常看到表头固定,表身支持滚动的需求,由于项目经常会用到一些自定义的表格展示数据,之前经常发现每次都是自己去写,自己去重新定义样式,觉得特别的麻烦,现在我特针对这类的分享一下。 1、页面…

【电巢】新能源产业景气度加速向上,功率器件3000亿赛道国产替代已在路上!(附70+厂家名单部分厂家替代型号)

前言 目前消费电子疲软继续蔓延,半导体设计端分化明显,存储、CPU等产品需求延续弱势,但IGBT和SiC等功率器件逐步迎来收获期。半导体周期拐点已至,曙光乍现。 在整个半导体周期背景下,新能源汽车俨然已成为逆势窗口产业…

现在健身耳机哪个牌子好、2023年最好的健身房耳机推荐

很多朋友在运动健身的时候喜欢戴上耳机,在音乐的节奏中去运动,现在市面上的运动耳机选择也特别丰富,但是说实话,从专业角度来看能真正适合运动的蓝牙耳机其实还是比较罕见的。这也就导致了我们许多朋友在选购时特别容易踩坑&#…

React - redux 使用(由浅入深)

React - redux 使用(由浅入深)一. redux理解1. redux 介绍2. redux 使用情况3. redux 工作流程4. redux 三个核心概念4.1 Action4.2 Store4.3 Reducers5. redux 核心API5.1 createStore()5.2 Store5.2.1 Store 方法5.2.1.1 getState()5.2.1.2 dispatch(a…