04-Nacos服务注册中心应用实践,java面试逻辑题及答案

  • 生产者服务创建及注册

  • 消费者服务发现及调用

  • 小节面试分析

  • 服务负载均衡设计及实现(重点)

    • 业务描述
  • LoadBalancerClient应用

  • @LoadBalanced

  • Ribbon负载均衡策略(了解)

  • 小节面试分析

  • 基于Feign的远程服务调用(重点)

    • 背景分析
  • Feign是什么

  • Feign应用实践(掌握)

  • Feign配置进阶实践

  • Feign 调用过程分析(了解)

  • 小节面试分析

  • 总结(Summary)

    • 重难点分析
  • FAQ分析

  • Bug分析

注册中心简介

================================================================

背景分析


在微服务中,首先需要面对的问题就是如何查找服务(软件即服务),其次,就是如何在不同的服务之间进行通信?如何更好更方便的管理应用中的每一个服务,如何建立各个服务之间联系的纽带,由此注册中心诞生(例如淘宝网卖家提供服务,买家调用服务)。

市面上常用注册中心有Zookeeper(雅虎Apache),Eureka(Netfix),Nacos(Alibaba),Consul(Google),那他们分别都有什么特点,我们如何进行选型呢?我们主要从社区活跃度,稳定性,功能,性能等方面进行考虑即可.本次微服务的学习,我们选择Nacos,它很好的支持了阿里的双11活动,不仅可以做注册中心,还可以作为配置中心,稳定性和性能都很好。

Nacos概述


Nacos(DynamicNaming and Configuration Service)是一个应用于服务注册与发现、配置管理的平台。它孵化于阿里巴巴,成长于十年双十一的洪峰考验,沉淀了简单易用、稳定可靠、性能卓越的核心竞争力。其官网地址如下:

https://nacos.io/zh-cn/docs/quick-start.html

构建Nacos服务

===================================================================

准备工作


第一:确保你电脑已配置JAVA_HOME环境变量(Nacos启动时需要),例如:

在这里插入图片描述

第二:确保你的MySQL版本为5.7以上(MariaDB10.5以上),例如

在这里插入图片描述

下载与安装


第一步:Nacos下载,可在浏览器直接输入如下地址:

https://github.com/alibaba/nacos/releases

第二步:选择对应版本,直接下载,如图所示:

在这里插入图片描述

第三步:解压Nacos(最好不要解压到中文目录下),其目录结构如下:

在这里插入图片描述

初始化配置


第一步:打开操作系统命令行,登陆mysql,执行课前资料中的sql脚本,不是nacos/conf目录下自带的。

例如,我们可以使用mysql自带客户端,在命令行首先登录mysql,然后执行如下指令:

source d:/nacos-mysql.sql

执行成功以后,会创建一个nacos_config数据库,打开数据库会看到一些表,例如;

在这里插入图片描述

说明:在执行此文件时,要求mysql的版本大于5.7版本(MariaDB最好10.5.11),否则会出现如下错误:

在这里插入图片描述

第二步:打开/nacos/conf/application.properties里打开默认配置,并基于你当前环境配置要连接的数据库,连接数据库时使用的用户名和密码(假如前面有"#"要将其去掉):

If use MySQL as datasource:

spring.datasource.platform=mysql

Count of DB:

db.num=1

Connect URL of DB:

db.url.0=jdbc:mysql://127.0.0.1:3306/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC

db.user.0=root

db.password.0=root

服务启动与访问


第一步:启动Nacos服务(nacos的bin目录去通过指令启动)。

Linux/Unix/Mac启动命令(standalone代表着单机模式运行,非集群模式):

./startup.sh -m standalone

Windows启动命令(standalone代表着单机模式运行,非集群模式):

startup.cmd -m standalone

说明:

1)执行执行令时要么配置环境变量,要么直接在nacos/bin目录下去执行.

2)nacos启动时需要本地环境变量中配置了JAVA_HOME(对应jdk的安装目录),

3)一定要确保你连接的数据库(nacos_config)是存在的.

4)假如所有的配置都正确,还连不上,检查一下你有几个数据库(mysql,…)

第二步:访问Nacos服务。

打开浏览器,输入http://localhost:8848/nacos地址,出现如下登陆页面:

在这里插入图片描述

其中,默认账号密码为nacos/nacos.

服务注册与调用入门(重点)

=======================================================================

业务描述


创建两个项目Module分别为服务提供者和服务消费者(假如已有则无需创建),两者都要注册到NacosServer中(这个server本质上就是一个web服务,端口默认为8848),然后服务提供者可以为服务消费者提供远端调用服务(例如支付服务为服务提供方,订单服务为服务消费方),如图所示:

在这里插入图片描述

生产者服务创建及注册


第一步:创建服务提供者工程(module名为sca-provider,假如已有则无需创建),继承parent工程(01-sca),其pom.xml文件内容如下:

<?xml version="1.0" encoding="UTF-8"?>

<project xmlns=“http://maven.apache.org/POM/4.0.0”

xmlns:xsi=“http://www.w3.org/2001/XMLSchema-instance”

xsi:schemaLocation=“http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd”>

01-sca

com.jt

1.0-SNAPSHOT

4.0.0

sca-provider

org.springframework.boot

spring-boot-starter-web

com.alibaba.cloud

spring-cloud-starter-alibaba-nacos-discovery

第二步:创建并修改配置文件application.yml(或者application.properties),实现服务注册,关键代码如下:

server:

port: 8081

spring:

application:

name: sca-provider #进行服务注册必须配置服务名

cloud:

nacos:

discovery:

server-addr: localhost:8848

注意:服务名不要使用下划线(“_”),应使用横杠(“-”),这是规则。

第三步:创建启动类(假如已有则无需定义),关键代码如下:

package com.jt;

@SpringBootApplication

public class ProviderApplication {

public static void main(String[] args) {

SpringApplication.run(ProviderApplication.class, args);

}

}

第四步:启动启动类,然后刷先nacos服务,检测是否服务注册成功,如图所示:

在这里插入图片描述

第五步:停掉sca-provider服务,然后不断刷新nacos服务列表,检查服务的健康状态。

消费者服务发现及调用


第一步: 在sca-provider项目中创建服务提供方对象,基于此对象对外提供服务,例如:

package com.jt.provider.controller;

/**定义Controller对象(这个对象在spring mvc中给他的定义是handler),

  • 基于此对象处理客户端的请求*/

@RestController

public class ProviderController{

//@Value默认读取项目配置文件中配置的内容

//8080为没有读到server.port的值时,给定的默认值

@Value(“${server.port:8080}”)

private String server;

//http://localhost:8081/provider/echo/tedu

@GetMapping(“/provider/echo/{msg}”)

public String doRestEcho1(@PathVariable String msg){

return server+" say hello "+msg;

}

}

第二步:创建服务消费者工程(module名为sca-consumer,假如已有则无需创建),继承parent工程(01-sca),其pom.xml文件内容如下:

<?xml version="1.0" encoding="UTF-8"?>

<project xmlns=“http://maven.apache.org/POM/4.0.0”

xmlns:xsi=“http://www.w3.org/2001/XMLSchema-instance”

xsi:schemaLocation=“http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd”>

01-sca

com.jt

1.0-SNAPSHOT

4.0.0

sca-consumer

org.springframework.boot

spring-boot-starter-web

com.alibaba.cloud

spring-cloud-starter-alibaba-nacos-discovery

第三步:创建sca-consumer服务中的配置文件application.yml,关键代码如下:

server:

port: 8090

spring:

application:

name: sca-consumer #服务注册时,服务名必须配置

cloud:

nacos:

discovery:

server-addr: localhost:8848 #从哪里去查找服务

第四步:创建消费端启动类并实现服务消费,关键代码如下:

package com.jt;

@SpringBootApplication

public class ConsumerApplication {

public static void main(String[] args) {

SpringApplication.run(ConsumerApplication.class,args);

}

}

第五步:在sca-consumer启动类中添加如下方法,用于创建RestTemplate对象.

@Bean

public RestTemplate restTemplate(){//基于此对象实现远端服务调用

return new RestTemplate();

}

第六步:定义sca-consumer服务的消费端Controller,在此对象方法内部实现远端服务调用

package com.jt.consumer.controller;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.stereotype.Component;

import org.springframework.web.bind.annotation.GetMapping;

import org.springframework.web.bind.annotation.RestController;

import org.springframework.web.client.RestTemplate;

/**

  • 定义服务消费端Controller,在这个Controller对象

  • 的方法中实现对远端服务sca-provider的调用

*/

@RestController

public class ConsumerController {

/**

  • 从spring容器获取一个RestTemplate对象,

  • 基于此对象实现远端服务调用

*/

@Autowired

private RestTemplate restTemplate;

/**

  • 在此方法中通过一个RestTemplate对象调用远端sca-provider中的服务

  • @return

  • 访问此方法的url: http://localhost:8090/consumer/doRestEcho1

*/

@GetMapping(“/consumer/doRestEcho1”)

public String doRestEcho01(){

//1.定义要调用的远端服务的url

String url=“http://localhost:8081/provider/echo/8090”;

//2.基于restTemplate对象中的相关方法进行服务调用

return restTemplate.getForObject(url, String.class);

}

}

第七步:启动消费者服务,并在浏览器输入http://localhost:8090/consumer/doRestEcho1地址进行访问测试。

小节面试分析


  • 为什么要将服务注册到nacos?(为了更好的查找这些服务)

  • 在Nacos中服务提供者是如何向Nacos注册中心(Registry)续约的?(5秒心跳)

  • 对于Nacos服务来讲它是如何判定服务实例的状态?(检测心跳包,15,30)

  • 服务消费方是如何调用服务提供方的服务的?(RestTemplate)

服务负载均衡设计及实现(重点)

=========================================================================

业务描述


自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Java)
img

最后

针对以上面试题,小编已经把面试题+答案整理好了

最新大厂必问微服务面试题汇总:SpringCloud、Boot、Dubbo

最新大厂必问微服务面试题汇总:SpringCloud、Boot、Dubbo

最新大厂必问微服务面试题汇总:SpringCloud、Boot、Dubbo

面试专题

image

除了以上面试题+答案,小编同时还整理了微服务相关的实战文档也可以分享给大家学习

image

image

image
vrGF-1711801104234)]
[外链图片转存中…(img-gDdfGFbQ-1711801104234)]
[外链图片转存中…(img-pAf0RSbU-1711801104234)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Java)
[外链图片转存中…(img-kTvRU5g1-1711801104235)]

最后

针对以上面试题,小编已经把面试题+答案整理好了

[外链图片转存中…(img-ppAyTyEV-1711801104235)]

[外链图片转存中…(img-Lp0oWxCO-1711801104235)]

[外链图片转存中…(img-pY0MsCNy-1711801104236)]

面试专题

[外链图片转存中…(img-lEY2xg0v-1711801104236)]

除了以上面试题+答案,小编同时还整理了微服务相关的实战文档也可以分享给大家学习

[外链图片转存中…(img-Pd0r0GxQ-1711801104236)]

[外链图片转存中…(img-z4NUwHiQ-1711801104237)]

[外链图片转存中…(img-35PKgEr6-1711801104237)]

  • 21
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值