SpringCloud学习二

基本介绍:

Eureka Server(Eureka 服务端)是Netflix开源的一款用于构建分布式系统中的服务发现和注册中心的组件。它在微服务架构中扮演着关键的角色,允许不同的微服务应用程序注册自己,并查询其他服务的位置信息,以便它们可以相互通信。

以下是关于Eureka Server的一些重要介绍和特点:

  1. 服务注册和发现:Eureka Server允许微服务应用程序在启动时将自己注册到Eureka注册中心,以便其他服务可以发现它们。注册的服务可以提供有关其名称、IP地址、端口和健康状态等信息。

  2. 健康检查:Eureka Server支持对注册的服务进行健康检查,以便在服务不可用时将其从注册表中移除。这有助于避免将请求路由到不可用的服务实例。

  3. 客户端负载均衡:Eureka客户端库可用于在微服务消费者之间实现负载均衡。消费者可以从Eureka Server中获取可用服务实例的列表,并选择一个进行调用。

  4. 自我保护机制:Eureka Server具有自我保护机制,可以在某些情况下防止服务注册表中的整体故障。如果Eureka Server在一段时间内无法收到心跳信号,它不会立即删除该服务,而是将其标记为"不健康",并继续提供服务。这有助于防止因网络故障或其他问题导致的误删除服务。

  5. 集群支持:Eureka Server支持构建高可用性集群,其中多个Eureka Server实例一起工作,以确保可用性和冗余。

  6. Spring Cloud集成:Eureka Server通常与Spring Cloud一起使用,以便轻松构建和管理微服务架构。Spring Cloud提供了对Eureka的集成支持,使开发者能够更容易地使用Eureka进行服务注册和发现。

Eureka Client是一个用于与Eureka Server进行通信的库或模块,通常用于微服务架构中的服务提供者和服务消费者。Eureka Client允许微服务应用程序向Eureka Server注册自己并查询其他已注册的服务的位置信息,以便实现服务的发现和负载均衡。

以下是关于Eureka Client的一些重要信息和功能:

  1. 服务注册:服务提供者(通常是一个微服务应用程序)使用Eureka Client来向Eureka Server注册自己。注册包括提供服务的名称、IP地址、端口号以及其他元数据信息。一旦注册,其他服务就可以通过Eureka Server发现并调用该服务。

  2. 服务发现:服务消费者使用Eureka Client来从Eureka Server中获取可用服务实例的列表。Eureka Client通过查询Eureka Server来获取这些信息,并维护本地缓存以实现快速访问。消费者可以根据服务的名称来发现可用的服务实例,并选择一个实例进行调用。

  3. 负载均衡:Eureka Client通常与负载均衡器结合使用,以确保请求均匀地分配到多个服务实例中。通过从Eureka Server获取实例列表并使用负载均衡策略选择实例,Eureka Client可以帮助分散服务调用的负载,提高系统性能和可用性。

  4. 健康检查:Eureka Client定期向Eureka Server发送心跳信号,以表明它仍然处于活动状态。Eureka Server可以使用这些心跳信号来检测服务实例的健康状况,并在需要时将其标记为不健康或下线。

  5. 故障转移:如果Eureka Client无法连接到Eureka Server,它会尝试与其他Eureka Server实例建立连接(如果配置了多个)。这有助于提高系统的可用性,即使一个Eureka Server实例不可用,服务注册和发现仍然可以正常工作。

  6. Spring Cloud集成:Eureka Client通常与Spring Cloud一起使用,以便轻松构建和管理微服务架构。Spring Cloud提供了对Eureka Client的集成支持,使开发者能够更容易地将服务注册到Eureka Server和发现其他服务。

Eureka Client 代码实现

基本结构:

  • 创建 Module ,pom.xml

<dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId><version>2.0.2.RELEASE</version></dependency>
</dependencies>
  • 创建配置文件 application.yml,添加 Eureka Client 相关配置

server:port: 8010
spring:application:name: provider
eureka:client:service-url:defaultZone: http://localhost:8761/eureka/instance:prefer-ip-address: true

属性说明:

spring.application.name:当前服务注册在 Eureka Server 上的名称。

eureka.client.service-url.defaultZone:注册中心的访问地址。

eureka.instance.prefer-ip-address:是否将当前服务的 IP 注册到 Eureka Server。

  • 创建启动类

package com.southwind;
​
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
​
@SpringBootApplication
public class ProviderApplication {public static void main(String[] args) {SpringApplication.run(ProviderApplication.class,args);}
}
  • 实体类

package com.southwind.entity;
​
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
​
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Student {private long id;private String name;private int age;
}
  • Repository

package com.southwind.repository;
​
import com.southwind.entity.Student;
​
import java.util.Collection;
​
public interface StudentRepository {public Collection<Student> findAll();public Student findById(long id);public void saveOrUpdate(Student student);public void deleteById(long id);
}
  • RepositoryImpl

package com.southwind.repository.impl;
​
import com.southwind.entity.Student;
import com.southwind.repository.StudentRepository;
import org.springframework.stereotype.Repository;
​
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
​
@Repository
public class StudentRepositoryImpl implements StudentRepository {
​private static Map<Long,Student> studentMap;
​static {studentMap = new HashMap<>();studentMap.put(1L,new Student(1L,"张三",22));studentMap.put(2L,new Student(2L,"李四",23));studentMap.put(3L,new Student(3L,"王五",24));}
​@Overridepublic Collection<Student> findAll() {return studentMap.values();}
​@Overridepublic Student findById(long id) {return studentMap.get(id);}
​@Overridepublic void saveOrUpdate(Student student) {studentMap.put(student.getId(),student);}
​@Overridepublic void deleteById(long id) {studentMap.remove(id);}
}
  • Handler

package com.southwind.controller;
​
import com.southwind.entity.Student;
import com.southwind.repository.StudentRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
​
import java.util.Collection;
​
@RestController
@RequestMapping("/student")
public class StudentHandler {@Autowiredprivate StudentRepository studentRepository;
​@GetMapping("/findAll")public Collection<Student> findAll(){return studentRepository.findAll();}
​@GetMapping("/findById/{id}")public Student findById(@PathVariable("id") long id){return studentRepository.findById(id);}
​@PostMapping("/save")public void save(@RequestBody Student student){studentRepository.saveOrUpdate(student);}
​@PutMapping("/update")public void update(@RequestBody Student student){studentRepository.saveOrUpdate(student);}
​@DeleteMapping("/deleteById/{id}")public void deleteById(@PathVariable("id") long id){studentRepository.deleteById(id);}
}

运行启动类,先运行Eurek启动类:

访问8761端口:

RestTemplate基本介绍:

在Spring Cloud中,RestTemplate是一个常用的HTTP客户端工具,用于在微服务架构中进行服务间的通信。Spring Cloud通过提供一些额外的功能来增强RestTemplate,以便更轻松地与分布式系统中的微服务进行交互。以下是一些关于在Spring Cloud中使用RestTemplate的注意事项:

  1. 负载均衡: Spring Cloud集成了负载均衡器Ribbon,可以让RestTemplate自动选择要调用的服务实例。您可以使用服务的名称而不是硬编码的URL来发送请求。例如:

    restTemplate.getForObject("http://my-service/api/resource", String.class);

    在这个例子中,my-service是服务的名称,Ribbon会自动选择一个可用的实例进行调用。

  2. 服务发现: Spring Cloud集成了Eureka或其他服务注册中心,可以让RestTemplate自动发现可用的服务实例。这意味着您不需要手动配置每个服务的主机和端口,而是使用服务的名称来访问它们。

  3. 请求拦截器: Spring Cloud允许您添加拦截器来处理请求和响应,例如添加身份验证信息、记录请求日志等。这可以通过实现ClientHttpRequestInterceptor接口来实现。

  4. 错误处理: 在Spring Cloud中,RestTemplate通常会捕获HTTP错误,并将它们封装为HttpClientErrorException(如4xx错误)或HttpServerErrorException(如5xx错误)等异常。这样,您可以更容易地处理HTTP错误。

  5. 配置管理: 使用Spring Cloud Config,您可以在不同的环境中为RestTemplate配置不同的属性,如超时时间、连接池大小等。

  6. 断路器模式: Spring Cloud集成了Hystrix,可以通过@HystrixCommand注解来保护RestTemplate的调用,以便在服务不可用时进行降级或错误处理。

RestTemplate 的使用

结构图:

  • 什么是 RestTemplate?

RestTemplate 是 Spring 框架提供的基于 REST 的服务组件,底层是对 HTTP 请求及响应进行了封装,提供了很多访问 RETS 服务的方法,可以简化代码开发。

  • 如何使用 RestTemplate?

1、创建 Maven 工程,pom.xml。

2、创建实体类

package com.southwind.entity;
​
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
​
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Student {private long id;private String name;private int age;
}

3、Handler

package com.southwind.controller;
​
import com.southwind.entity.Student;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.client.RestTemplate;
​
import java.util.Collection;
​
@RestController
@RequestMapping("/rest")
public class RestHandler {@Autowiredprivate RestTemplate restTemplate;
​@GetMapping("/findAll")public Collection<Student> findAll(){return restTemplate.getForEntity("http://localhost:8010/student/findAll",Collection.class).getBody();}
​@GetMapping("/findAll2")public Collection<Student> findAll2(){return restTemplate.getForObject("http://localhost:8010/student/findAll",Collection.class);}
​@GetMapping("/findById/{id}")public Student findById(@PathVariable("id") long id){return restTemplate.getForEntity("http://localhost:8010/student/findById/{id}",Student.class,id).getBody();}
​@GetMapping("/findById2/{id}")public Student findById2(@PathVariable("id") long id){return restTemplate.getForObject("http://localhost:8010/student/findById/{id}",Student.class,id);}
​@PostMapping("/save")public void save(@RequestBody Student student){restTemplate.postForEntity("http://localhost:8010/student/save",student,null).getBody();}
​@PostMapping("/save2")public void save2(@RequestBody Student student){restTemplate.postForObject("http://localhost:8010/student/save",student,null);}
​@PutMapping("/update")public void update(@RequestBody Student student){restTemplate.put("http://localhost:8010/student/update",student);}
​@DeleteMapping("/deleteById/{id}")public void deleteById(@PathVariable("id") long id){restTemplate.delete("http://localhost:8010/student/deleteById/{id}",id);}
}

4、启动类

package com.southwind;
​
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;
​
@SpringBootApplication
public class RestTemplateApplication {public static void main(String[] args) {SpringApplication.run(RestTemplateApplication.class,args);}
​@Beanpublic RestTemplate restTemplate(){return new RestTemplate();}
}

Consumer基本介绍:

服务消费者(Consumer)是微服务架构中的一种角色,它用于调用和使用提供者服务的功能。服务消费者通常不负责实际的业务逻辑处理,而是依赖于提供者服务来获取所需的数据或执行操作。在微服务架构中,服务消费者通常使用HTTP请求或其他通信协议与提供者服务进行通信。

以下是有关服务消费者的一些关键概念和特点:

  1. 依赖性: 服务消费者依赖于一个或多个提供者服务,它们是整个系统中的客户端。

  2. 服务发现: 为了与提供者服务通信,服务消费者通常需要了解提供者服务的位置信息。这可以通过服务发现机制来实现,其中服务提供者会将自己注册到服务注册中心(如Eureka),而服务消费者可以查询注册中心来获取可用的提供者服务列表。

  3. 负载均衡: 微服务架构通常包含多个相同功能的提供者服务实例,服务消费者可以使用负载均衡来分发请求,以确保高可用性和性能。

  4. 断路器: 为了防止服务消费者在提供者服务不可用或出现故障时受到影响,可以使用断路器模式(如Hystrix)来实现容错和降级。断路器会在一段时间内监控服务提供者的响应,并在需要时停止向不可用的服务实例发送请求。

  5. 请求和响应处理: 服务消费者使用HTTP客户端(如RestTemplate)来发送请求到提供者服务,并处理来自提供者的响应。通常,响应会被解析并转换为服务消费者的领域对象。

  6. 容器化: 服务消费者通常是运行在容器中的,如Docker容器。这使得它们可以轻松地部署和扩展。

  7. 配置管理: 服务消费者需要配置和管理与提供者服务的通信方式,包括URL、端口、超时等。Spring Cloud Config等工具可以用于集中管理这些配置。

  8. 安全性: 通信通常需要进行安全处理,以确保数据的机密性和完整性。安全性可以通过HTTPS、OAuth2等方式来实现。

  9. 监控和追踪: 服务消费者可能需要监控其与提供者服务之间的通信,并记录请求和响应以进行追踪和故障排除。Spring Cloud Sleuth和Zipkin等工具可用于实现分布式跟踪。

服务消费者 consumer

结构图:

  • 创建 Maven 工程,pom.xml

<dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId><version>2.0.2.RELEASE</version></dependency>
</dependencies>
  • 创建配置文件 application.yml

server:port: 8020
spring:application:name: consumer
eureka:client:service-url:defaultZone: http://localhost:8761/eureka/instance:prefer-ip-address: true
  • 创建启动类

package com.southwind;
​
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;
​
@SpringBootApplication
public class ConsumerApplication {public static void main(String[] args) {SpringApplication.run(ConsumerApplication.class,args);}
​@Beanpublic RestTemplate restTemplate(){return new RestTemplate();}
}
  • Handler

package com.southwind.controller;
​
import com.southwind.entity.Student;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.client.RestTemplate;
​
import java.util.Collection;
​
@RestController
@RequestMapping("/consumer")
public class ConsumerHandler {@Autowiredprivate RestTemplate restTemplate;
​@GetMapping("/findAll")public Collection<Student> findAll(){return restTemplate.getForEntity("http://localhost:8010/student/findAll",Collection.class).getBody();}
​@GetMapping("/findAll2")public Collection<Student> findAll2(){return restTemplate.getForObject("http://localhost:8010/student/findAll",Collection.class);}
​@GetMapping("/findById/{id}")public Student findById(@PathVariable("id") long id){return restTemplate.getForEntity("http://localhost:8010/student/findById/{id}",Student.class,id).getBody();}
​@GetMapping("/findById2/{id}")public Student findById2(@PathVariable("id") long id){return restTemplate.getForObject("http://localhost:8010/student/findById/{id}",Student.class,id);}
​@PostMapping("/save")public void save(@RequestBody Student student){restTemplate.postForEntity("http://localhost:8010/student/save",student,null).getBody();}
​@PostMapping("/save2")public void save2(@RequestBody Student student){restTemplate.postForObject("http://localhost:8010/student/save",student,null);}
​@PutMapping("/update")public void update(@RequestBody Student student){restTemplate.put("http://localhost:8010/student/update",student);}
​@DeleteMapping("/deleteById/{id}")public void deleteById(@PathVariable("id") long id){restTemplate.delete("http://localhost:8010/student/deleteById/{id}",id);}
}

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Rust专属开发工具——RustRover发布

JetBrains最近推出的Rust集成开发工具——RustRover已经发布&#xff0c;官方网站&#xff1a;RustRover: Rust IDE by JetBrains JetBrains出品过很受欢迎的开发工具IntelliJ IDEA、PyCharm等。 RustRover优势 Rust集成环境&#xff0c;根据向导可自动下载安装rust开发环境提…

Hadoop-2.5.2平台环境搭建遇到的问题

文章目录 一、集群环境二、MySQL2.1 MySQL初始化失败2.2 MySQL启动报错2.3 启动时报不能打开日志错2.4 mysql启动时pid报错 二、Hive2.1 Hive修改core-site.xml文件后刷新权限2.2 Hive启动元数据时报错2.3 Hive初始化MySQL报错2.3.1 报错信息2.3.2 错误原因2.3.3 参考文档 2.4 …

归纳所猜半结论推出完整结论:CF1592F1

https://www.luogu.com.cn/problem/CF1592F1 场上猜了个结论&#xff0c;感觉只会操作1。然后被样例1hack了。然后就猜如果 ( n , m ) (n,m) (n,m) 为1则翻转4操作&#xff0c;被#14hack了。然后就猜4操作只会进行一次&#xff0c;然后就不知道怎么做下去了。 上面猜的结论都…

[CISCN2019 总决赛 Day2 Web1]Easyweb 盲注 \\0绕过 文件上传文件名木马

首先开局登入 我们开始目录扫描 扫除 robots.txt 现在只有三个文件 最后发现 只有 image.php.bak存在 这里主要的地方是 \\0 因为第一个\会被转义 这里就会变为 \0 表示空白 那我们sql语句就会变为了 select * from images where id\0 但是这里我们不可以使用 \\ 因为…

计算机视觉--距离变换算法

计算机视觉 文章目录 计算机视觉前言距离变换 总结 前言 计算机视觉CV是人工智能一个非常重要的领域。 在本次的距离变换任务中&#xff0c;我们将使用D4距离度量方法来对图像进行处理。通过这次实验&#xff0c;我们可以更好地理解距离度量在计算机视觉中的应用。希望大家对计…

Arcgis日常天坑问题(1)——将Revit模型转为slpk数据卡住不前

这段时间碰到这么一个问题&#xff0c;revit模型在arcgis pro里导出slpk的时候&#xff0c;卡在98%一直不动&#xff0c;大约有两个小时。 首先想到的是revit模型过大&#xff0c;接近300M。然后各种减小模型测试&#xff0c;还是一样的问题&#xff0c;大概花了两天的时间&am…

基于ffmpeg给视频添加时间字幕

FFmpeg是一套可以用来记录、转换数字音频、视频&#xff0c;并能将其转化为流的开源计算机程序&#xff0c;我们可以基于ffmpeg对视频进行各种操作。本文主要介绍基于ffmpeg给视频添加字幕&#xff0c;字幕的内容为视频所播放的时间&#xff08;故需要安装ffmpeg&#xff0c;具…

【Python】实现excel文档中指定工作表数据的更新操作

在做数值计算时&#xff0c;个人比较习惯利用excel文档的公式做数值计算进行对比&#xff0c;检查异常&#xff0c;虽然计算量大后&#xff0c;excel计算会比较缓慢&#xff0c;但设计简单&#xff0c;易排错 但一般测试过程中使用到的数据都不是最终数值&#xff0c;会不停根据…

【chrome基础】Chrome、Chromium、libcef、electron版本关系大揭秘!

文章目录 概述chrome、Chromium、cef、electron 版本管理chrome的各种概念和学习资料V8 bindings 设计谷歌V8引擎探秘&#xff1a;基础概念Chrome 的插件&#xff08;Plugin&#xff09;与扩展&#xff08;Extension&#xff09;Chrome插件开发 概述 Chrome、Chromium、libcef、…

使用GitLab CI/CD 定时运行Playwright自动化测试用例

创建项目并上传到GitLab npm init playwright@latest test-playwright # 一路enter cd test-playwright # 运行测试用例 npx playwright test常用指令 # Runs the end-to-end tests. npx playwright test# Starts the interactive UI mode. npx playwright

Oracle 简介与 Docker Compose部署

最近&#xff0c;我翻阅了在之前公司工作时的笔记&#xff0c;偶然发现了一些有关数据库的记录。当初&#xff0c;我们的项目一开始采用的是 Oracle 数据库&#xff0c;但随着项目需求的变化&#xff0c;我们不得不转向使用 SQL Server。值得一提的是&#xff0c;公司之前采用的…

Servlet

Servlet Servlet是Java提供的一门动态web资源开发技术&#xff0c;其实就是一个接口&#xff08;规范&#xff09;&#xff0c;将来我们需要自定义Servlet类实现Servlet接口即可&#xff0c;并由web服务器运行Servlet。 快速入门 创建Web项目&#xff0c;导入Servlet依赖坐标…

linux 安装下载conda并创建虚拟环境

目录 1. 下载安装2. 创建虚拟环境1. 下载安装 在window操作系统中下载anconda包,并通过scp传输到ubuntu操作系统 具体anconda包在如下界面: anconda包 目录 博主选择了最新的包:Anaconda3-2023.09-0-Linux-x86_64.sh 通过scp传输到ubuntu操作系统中: 并在ubuntu操作系…

8、Docker数据卷与数据卷容器

一、数据卷(Data Volumes) 为了很好的实现数据保存和数据共享&#xff0c;Docker提出了Volume这个概念&#xff0c;简单的说就是绕过默认的联合文件系统&#xff0c;而以正常的文件或者目录的形式存在于宿主机上。又被称作数据卷。 数据卷 是一个可供一个或多个容器使用的特殊目…

信息系统项目管理师第四版学习笔记——项目进度管理

项目进度管理过程 项目进度管理过程包括&#xff1a;规划进度管理、定义活动、排列活动顺序、估算活动持续时间、制订进度计划、控制进度。 规划进度管理 规划进度管理是为规划、编制、管理、执行和控制项目进度而制定政策、程序和文档的过程。本过程的主要作用是为如何在…

【17】c++设计模式——>原型模式

原型模式的定义 c中的原型模式&#xff08;Prototype Pattern&#xff09;是一种创建型设计模式&#xff0c;其目的是通过复制&#xff08;克隆&#xff09;已有对象来创建新的对象&#xff0c;而不需要显示的使用构造函数创建对象&#xff0c;原型模式适用于创建复杂对象时&a…

vue3+vite+ts中的@的配置

文章 前言错误场景问题分析解决方案后言 前言 ✨✨ 我们是天生勇敢的开发者&#xff0c;我们创造bug&#xff0c;传播bug&#xff0c;毫不留情地消灭bug&#xff0c;在这个过程中我们创造了很多bug以供娱乐。 错误场景 vue3 vite ts 问题分析 在vue3的项目开发中我遇到了这样…

【Linux】 vi / vim 使用

天天用vim 或者vi 。看着大佬用的很6 。我们却用的很少。今天咱们一起系统学习一下。 vi / vim 发展史 vi 是一款由加州大学伯克利分校&#xff0c;Bill Joy研究开发的文本编辑器。 vim Vim是一个类似于Vi的高度可定制的文本编辑器&#xff0c;在Vi的基础上改进和增加了很多…

35.树与二叉树练习(1)(王道第5章综合练习)

【所用的树&#xff0c;队列&#xff0c;栈的基本操作详见上一节代码】 试题1&#xff08;王道5.3.3节第3题&#xff09;&#xff1a; 编写后序遍历二叉树的非递归算法。 参考&#xff1a;34.二叉链树的C语言实现_北京地铁1号线的博客-CSDN博客https://blog.csdn.net/qq_547…

使用asp.net core web api创建web后台,并连接和使用Sql Server数据库

前言&#xff1a;因为要写一个安卓端app&#xff0c;实现从服务器中获取电影数据&#xff0c;所以需要搭建服务端代码&#xff0c;之前学过C#&#xff0c;所以想用C#实现服务器段代码用于测试&#xff0c;本文使用C#语言&#xff0c;使用asp.net core web api组件搭建服务器端&…