Spring Cloud微服务入门(三)

news2024/11/28 10:35:40

服务注册与发现的概念

服务之间相互访问: 例如:用户中心与内容中心之间相互调用。
问题:

        服务调用需要知道对方的服务地址,地址写在哪里?

        如果服务是多个实例部署,该调用哪一个?

        如果服务是多个实例部署,每个实例负载如何分配?

解决不用修改代码始终能找到服务的方法: 独立的配置文件,让所有的服务读取这个配置。
依然存在的问题:

        随着服务越来越多,每个服务部署的实例越来越多,哪个上线,哪个下线不能靠手工维护。

        外部配置文件的问题,无法感知服务是不是存活,当只有调用时,才会发现服务存活与否。

服务注册中心。

原理:可以把服务注册与发现类比成一张表。 

服务注册与发现的产品

注册中心:

        使用Java开发的有:Nacos、Eureka、Zookeeper。

        使用Go语言开发的:Consul、CoreDNS。

选择注册与发现的产品:

首先我们学习的Java,更好的兼容,优先选择Java开发的。

         其次,Nacos作为后起之秀,当然要借助前辈的优势,所以Nacos能支持的,都支持了。

         在Spring Cloud体系上,Alibaba的产品,被称之为第二代微服务的典范,是应用的趋势,所以我们采用Nacos。 

服务注册中心:

        解决了服务始终能被找到,并且能及时发现服务是否存活的问题。

        一般集群都会部署很多个微服务节点。这些节点一般都具备两种角色,称为:“服务的提供者” 和 “服务的消费者”。

        “服务提供者”将自己的服务地址等信息登记到“服务注册中心”中,调用者(“服务消费者”)需要的时候,每次都先去“服务注册中心”查询即可。既解决了人工维护微服务节点状态的问题,也能解决多节点间负载均衡的问题。

服务注册与发现-Nacos

下载Nacos:

Redirecting to: https://nacos.io/

        登陆Nacos。 https://localhost:8848/nacos

        重要的功能: 服务管理。 配置管理。

使用Nacos

        新建Spring Boot的web项目。

        导入Spring Cloud Alibaba依赖。

                各版本之间的对应。

导入Spring Cloud Alibaba依赖。

         在dependencyManagement中加入依赖。 

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

在dependencies中加入Nacos依赖。

编写配置文件 在application.yml中,进行如下配置:
server:
    servlet:
        context-path:/user
    port:8080
spring:
    application:
        name:  user-center
    cloud:
        nacos:
            discovery:
                server-addr:  127.0.0.1:8848

启动项目,注册服务,在Nacos控制台中,存在配置的应用名称,说明服务注册成功。

引入nacos后的架构

 

 服务调用

常见的服务间调用方式有二种:

        RPC(Remote Produce Call)远程过程调用。 自定义数据格式,基于原生TCP通信,速度快、效率高,但较为复杂。 比如WebService框架CXF,阿里的Dubbo。

        HTTP,基于HTTP协议的服务调用。 跨平台、跨语言,但HTTP协议的信息较为臃肿,速度较慢。 比如HttpClient等。

基于HTTP的服务调用

JDK提供的HttpUrlConnection。

Apache的HttpClient。

Spring封装的RestTemplate。

Feign: NetFlix提供的,在RestTemplate和Ribbon基础上封装。

OpenFeign: Spring提供的,声明式服务调用。

RestTemplate介绍

RestTemplate:

        他简化了与HTTP服务的通信方式,统一了RESTful的标准,封装了http链接。

        相较于HttpClient等框架,他是一种更优雅的调用方式。

         常用方法: getForEntity()、getForObject()。 postForEntity()、postForObject()、postForLocation()。 PUT()、DELETE()等等。

RestTemplate问题

RestTemplate,调用的问题:

        地址是写死的,如果地址发生变化怎么办?。

        如果部署了多个实例(为了负载均衡)怎么办?

借助DiscoveryClient可以通过服务ID来访问,也可以按特定算法来访问服务的某个实例。

通过服务名让服务始终能找到:
//从注册中心一直只可以找到user-center
list<ServiceInstance>instances =discoveryclient.getInstances(serviceld:"user-center");
//使用是jdk1.8的特性
String targetuRL =instances.stream().map(instance ->instance.geturi().tostring()+"/"+
instance.getServiceId()+"/users/{id}")
.findFirst()//如果有多个实例,只取第一个实例
.orElseThrow(()->new IllegalArgumentException("当前没有实例"));
log.info(targetURL);
//通过id查询share
Share share =shareMapper.selectByPrimaryKey(id);
//通过share的userid查询userDTO
Integer userId =share.getUserId();
UserDTO userDTO =restTemplate.getForObject(
targetURL,
UserDTO.class,
userId);
使用随机算法,随机访问一个实例:
//从注册中心一直只可以找到user-center
List<ServiceInstance>instances =discoveryclient.getInstances(serviceld:"user-center");
//使用是jdk1.8的特性
List<String>targetuRLS =instances.stream()
.map(instance ->instance.getUri().tostring()+"/"+
instance.getServiceId()+"/users/{id}").collect(Collectors.tolist());//随机一个实例出来
int i =ThreadLocalRandom.current().nextInt(targetURLS.size());String targetuRL =targetURLS.get(i);
log.info(targetURL);
负载均衡简析

负载均衡是对系统的高可用、网络压力的缓解和处理能力扩容的重要手段之一。 以上例子中DiscoveryClient实现了简单的负载均衡

但仍然存在问题:

        访问服务的代码,实现了负载,但很繁琐。

        在业务逻辑中,出现了选择服务实例的代码,耦合高。

Ribbon简介

Ribbon是Netflix开源的客户端侧的负载均衡器。他简化服务调用的开发,并为我们提供一系列的负载均衡的算法。

 
 Ribbon的使用

添加Nacos依赖,因为Nacos依赖了Ribbon,所以不需要额外引入,默认情况下,也不需要加配置。 给RestTemplate开启Ribbon:

@Bean
@LoadBalanced
public RestTemplate restTemplate(){
    return new RestTemplate();
}

修改服务调用代码: 

//通过id查询share
Share share =shareMapper.selectByPrimaryKey(id);//通过share的userid查询userDTO
Integer userId =share.getUserId();
//url直接使用服务名,ribbon会给我们自动选择一个实例执行
UserDTo userDTO =restTemplate.getForObject(
url:"http://user-center/user-center/users/{id}",
JserDTO.class,
userId);
Ribbon的负载均衡规则 
 Ribbon的负载均衡配置

#细粒度配置,针对某一个服务

user-center:

        ribbon:

                NFLoadBalancerRuleClassName:com.netflix.loadbalancer.RandomRule

为所有微服务配置负载均衡: 在ComponentScan外新建全局Ribbon配置类:

@Configuration

public class DefaultRibbonconfiguration {

@Bean

public IRule ribbonRule(){return new RandomRule();}

所有微服务配置负载均衡: 在项目中新增Ribbon配置类 

@Configuration
@RibbonClients(defaultConfiguration =DefaultRibbonConfiguration.class)public class RibbonConfiguration {
}
Ribbon的配置项
 
Ribbon配置属性的方式

<clientName>.ribbon.xxx 如下属性:

        NFLoadBalancerClassName: ILoadBalancer实现类。

        NFLoadBalancerRuleClassName: Irule实现类。

        NFLoadBalancerPingClassName: Iping实现类。

        NIWSServerListClassName: ServerList实现类。

        NIWSServerListFilterClassName: ServerListFilter实现类 

Ribbon懒加载配置

服务重启后,第一次访问会比较慢,原因是Ribbon默认为所有的微服务开启的是懒加载模式,当服务调用到的时候,才会去创建对应的请求连接,如http://user-center/users/1,解决这个问题,需要在application.yml中配置如下: 

ribbon:
    eager-load;
        #开启饥饿加载
        enabled:  true
        #细粒度配置,指定服务,如果是多个,使用逗号分隔
        clients:  user-center
Ribbon扩展

在Ribbon的规则中,不支持Nacos的权重,而Nacos权重在实例的应用中,作用很大,可根据机器的配置动态调整所承受的请求量,所以需要扩展Ribbon的负载均衡策略。 

 

编写代码扩展Ribbon支持Nacos权重,继承AbstractLoadBalancerRule,编写代码,开启配置。
@override
public Server choose(Object o){
try {
BaseLoadBalancer loadBalancer =(BaseLoadBalancer)this.getLoadBalancer();
//想要请求的微服务名称
String name =loadBalancer.getName();
NamingService namingService =nacosDiscoveryProperties.namingServiceInstance();
Instance instance =namingService.selectoneHealthyInstance(name);
log.info("选择的实例是:port={},instance ={}",instance.getPort(),instance);
return new NacosServer(instance);
}catch(NacosException e){
e.printstackTrace();
return null;
Feign 

什么是Feign: Feign是Netflix开源的声明式HTTP客户端,致力于让编写http请求更简单。

RestTemplate与Feign的区别:

OpenFeign
什么是OpenFeign: OpenFeign是一个显示声明式的WebService客户端。 Spring Cloud对Feign进行了封装,使其支持MVC注解和HttpMessageConverts等,可以做到使用HTTP请求访问远程服务,就像调用本地方法一样的,开发者完全感知不到这是在调用远程方法,更感知不到在访问HTTP请求。 
使用OpenFeign

在启动类上加注解: 

 

编写服务调用接口:

在Service中注入并调用相关的方法

OpenFeign的组成 

 

OpenFeign的配置

全局配置日志,所有的Feign接口生效:

 属性配置方式支持的配置项

OpenFeign的性能优化

性能优化的方法:

        把默认的请求方式修改为httpclient或okhttp。

        在配置文件中,配置连接池(性能提升15%左右)。

        配置feign的日志级别,建议设置成BASIC。

引依赖:

写配置:

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

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

相关文章

父组件明明使用了v-model,子组件竟然可以不用定义props和emit抛出事件,快来看看吧

前言 vue3.4增加了defineModel宏函数&#xff0c;在子组件内修改了defineModel的返回值&#xff0c;父组件上v-model绑定的变量就会被更新。大家都知道v-model是:modelValue和update:modelValue的语法糖&#xff0c;但是你知道为什么我们在子组件内没有写任何关于props的定义和…

以动态库链接库 .dll 探索结构体参数

Dev c C语言实现第一个 dll 动态链接库 创建与调用-CSDN博客 在写dll 插件中发现的函数指针用途和 typedef 的定义指针的用法-CSDN博客 两步之后&#xff0c;尝试加入结构体实现整体数据使用。 注意结构体 Ak 是相同的 代码如下 DLL文件有两个&#xff0c;dll.dll是上面提到…

[LeetCode][LCR178]训练计划 VI——使用位运算寻找数组中不同的数字

题目 LCR 178. 训练计划 VI 教学过程中&#xff0c;教练示范一次&#xff0c;学员跟做三次。该过程被混乱剪辑后&#xff0c;记录于数组 actions&#xff0c;其中 actions[i] 表示做出该动作的人员编号。请返回教练的编号。 示例 1&#xff1a; 输入&#xff1a;actions [5, …

帝国CMS模板源码整站安装说明(图文)

安装步骤 第一步&#xff1a;先把得到的文件解压缩&#xff0c;把文件通过FTP传到空间里。&#xff08;请不要把类似www.lengleng.net这个文件夹传到FTP&#xff0c;请传这个大文件夹下面的所有文件夹和文件到空间根目录&#xff0c;请不要上传到2级目录&#xff0c;除非你自己…

kimi开放API使用了,来看如何使用

更多精彩内容在公众号。 kimi现在算是国内火得不行的AI工具。最近使用人太多&#xff0c;都经常出现响应不过来的情况。借助这波热潮&#xff0c;kimi顺势推出了API使用。 来看kimi的官方介绍使用。https://platform.moonshot.cn 文本生成模型 Moonshot的文本生成模型&#…

外包干了6天,技术明显进步

先说一下自己的情况&#xff0c;本科生&#xff0c;2019年我通过校招踏入了南京一家软件公司&#xff0c;开始了我的职业生涯。那时的我&#xff0c;满怀热血和憧憬&#xff0c;期待着在这个行业中闯出一片天地。然而&#xff0c;随着时间的推移&#xff0c;我发现自己逐渐陷入…

PWM 脉宽跟随方案介绍

1. 前言 数字电源产品在使用桥式电路拓扑或是多路交错控制中&#xff0c;有时会需要滞后臂的 PWM 脉宽严格跟随超前臂的 PWM 脉宽&#xff0c;或从路的 PWM 脉宽严格跟随主路的 PWM 脉宽&#xff0c;本文将介绍如何利用高精度定时器实现 PWM 输出脉宽跟随&#xff0c;一种使用…

设计模式浅析(十一) ·状态模式

设计模式浅析(十一) 状态模式 日常叨逼叨 java设计模式浅析&#xff0c;如果觉得对你有帮助&#xff0c;记得一键三连&#xff0c;谢谢各位观众老爷&#x1f601;&#x1f601; 状态模式 概念 状态模式 Java中的状态模式&#xff08;State Pattern&#xff09;是一种行为型…

Web漏洞-文件上传常见验证

后缀名&#xff1a;类型&#xff0c;文件头等 后缀名&#xff1a;黑白名单 文件类型&#xff1a;MIME信息 文件头&#xff1a;内容头信息 常见黑名单&#xff08;明确不允许上传的格式后缀&#xff09;&#xff1a;asp、php、jsp、aspx、cgi、war &#xff08;如果没有完整…

绿联 安装Frpc内网穿透并使用Nginx反向代理

绿联 安装Frpc内网穿透并使用Nginx反向代理 1、前言 服务器官网&#xff1a;雨云 - 新一代云服务提供商 本教程使用Frps与Frpc进行内网穿透&#xff0c;其中Frps需要自购服务器安装&#xff0c;若无法购买服务器则本教程对你无用&#xff1b; 另外还需拥有自己的域名&#xf…

什么是数据库?如何安装SQL Server(超详细版)

文章目录 什么是数据库数据库与数据库管理系统数据库系统之间的区别和联系数据库在生活中的应用 安装SQL Server数据库系统要求 安装步骤(超详细)安装前的准备 安装SSMS 什么是数据库 数据库&#xff0c;顾名思义&#xff0c;是存储数据的“仓库”。它不仅仅是简单的数据存储&…

软件验收流程

验收环节&#xff0c;甲方需要做哪些事情&#xff1f;这些事情的流程是什么&#xff1f;做这些事情能给甲方带来什么好处&#xff1f; 软件验收阶段&#xff0c;甲方要做的事情&#xff1a; 验收环节介绍 1. 开始 目的&#xff1a;启动验收流程&#xff0c;为后续工作做好准…

第九届蓝桥杯大赛个人赛省赛(软件类)真题C 语言 A 组-航班时间

#include<iostream> using namespace std;int getTime(){int h1, h2, m1, m2, s1, s2, d 0;//d一定初始化为0&#xff0c;以正确处理不跨天的情况 scanf("%d:%d:%d %d:%d:%d (%d)", &h1, &m1, &s1, &h2, &m2, &s2, &d);return d …

【随笔】Git 高级篇 -- 相对引用2 HEAD~n(十三)

&#x1f48c; 所属专栏&#xff1a;【Git】 &#x1f600; 作  者&#xff1a;我是夜阑的狗&#x1f436; &#x1f680; 个人简介&#xff1a;一个正在努力学技术的CV工程师&#xff0c;专注基础和实战分享 &#xff0c;欢迎咨询&#xff01; &#x1f496; 欢迎大…

matlab使用教程(37)—求解数值积分(2)

1多项式积分的解析解 本示例显示如何使用 polyint 函数对多项式求解析积分。使用此函数来计算多项式的不定积分。 1.1定义问题 考虑实数不定积分&#xff0c; 其中 k 是积分常量。由于没有指定积分限值&#xff0c; integral 函数族不太适合求解这个问题。 1.2用向量表示多…

量子计算领域迎来了一项令人振奋的突破。

近日&#xff0c;量子计算领域迎来了一项令人振奋的突破。Quantinuum公司与科技巨头Microsoft宣布&#xff0c;双方在容错量子计算方面取得了显著成果。这一成就原本预计需要数年时间才能实现&#xff0c;但两家公司的紧密合作使得这一目标提前达成。 Quantinuum的新一代量子计…

js笔记(学习存档)

JS的调用方式与执行顺序 使用方式 HTML页面中的任意位置加上<script type"module"></script>标签即可。 常见使用方式有以下几种&#xff1a; 直接在<script type"module"></script>标签内写JS代码。直接引入文件&#xff1a;…

2024-4-7 QT day1作业

myWidget.cpp #include "mywidget.h"MyWidget::MyWidget(QWidget *parent): QWidget(parent) {//设置窗口标题this->setWindowTitle("QQ");//设置窗口图标this->setWindowIcon(QIcon("C:\\Users\\张谦\\Desktop\\pictrue\\qq.png"));//设…

V R沉浸式体验的应用|R主题馆加盟|V R游戏体验馆加盟

《探索未知世界&#xff0c;沉浸式VR体验引领未来》 随着科技的飞速发展&#xff0c;虚拟现实&#xff08;VR&#xff09;技术正逐渐走进人们的生活&#xff0c;并为我们带来前所未有的沉浸式体验。下面让我们一起探索一下&#xff0c;VR沉浸式体验的应用领域和魅力所在。 虚…

安卓开机启动流程

目录 一、整体框架二、流程代码分析2.1 Boot ROM2.2 Boot Loader2.3 Kernel层Kernel代码部分 2.4 Init进程Init进程代码部分 2.5 zygote进程zygote代码部分 2.6 SystemServer进程SystemServer代码部分 2.7 启动Launcher与SystemUI 三、SystemServices3.1 引导服务3.2 核心服务3…