当前位置:网站首页 > Java基础 > 正文

java微服务基础



1. 概念

微服务是一种软件架构模式,它将应用程序分解为一组小型、自治的服务单元。
个人理解上:微服务就是将服务拆分,让一种服务在一台或者多台电脑上运行,如下图微服务技术栈所示:
image
注册中心可以配置在一台或者多台电脑上,将功能拆分,n台电脑共同实现一个软件

单体架构:将业务的所有功能集中在一个项目中开发,打成一个包部署

优点:

  1. 架构简单
  2. 部署成本低

缺点:耦合度高

微服务:一种良好的分布式架构方案

优点:拆分粒度更小、服务更独立、耦合度更低

缺点:架构非常复杂,运维、监控、部署难度提高

微服务技术对比:
image

2. 服务的远程调用

第一步:向spring容器中注入RestTemplate对象

在启动类(Application)中加入如下代码:

 

第二步:利用RestTemplate中getForObject方法或者postForObject方法发送请求

在业务逻辑层(一般是Service)中调用

 

3. 注册中心

Eureka

搭建Eureka服务器

1.创建Eureka服务器项目,引入spring-cloud-starter-netflix-eureka-server的依赖

 

注:这里不用加版本号,因为在父工程的依赖中已经指定springboot、springcloud和springcloud依赖库(spring-cloud-dependencies)

2.编写启动类,添加@EnableEurekaServer注解

3.添加application.yml文件,编写下面的配置:

 

Eureka自己也是服务,此处为注册自己

向Eureka服务器注册服务

在客户端项目中引入eureka-client依赖:

 

在客户端项目的application.yml中配置eureka地址

 

消费者拉取所有生产者实现负载均衡(服务发现)

1.修改业务逻辑层(Service)的代码,修改访问的url路径,用服务名代替ip、端口:

 

2.在消费者项目的启动类Application中的RestTemplate添加负载均衡注解:

 

Ribbon负载均衡

原理:

image

策略:

image

默认为ZoneAvoidanceRule

通过定义IRule实现可以修改负载均衡规则,有两种方式:

1、代码方式:在order-service中的OrderApplication类中,定义一个新的IRule:

 

2、配置文件方式:在消费者的application.yml文件中,添加新的配置也可以修改规则:

 

特点:懒加载

Ribbon默认是采用懒加载,即第一次访问时才会去创建LoadBalanceClient,请求时间会很长。而饥饿加载则会在项目启动时创建,降低第一次访问的耗时,通过下面配置开启饥饿加载:

 

Nacos

Nacos是阿里巴巴的产品,现在是Springcloud中的一个组件。相比Eureka功能更加丰富,在国内受欢迎程度较高。

安装

Windows安装:

开发阶段采用单机安装即可。

1.下载安装包
在Nacos的GitHub页面,提供有下载链接,可以下载编译好的Nacos服务端或者源代码:
GitHub主页:https://github.com/alibaba/nacos
GitHub的Release下载页:https://github.com/alibaba/nacos/releases

2.解压
将这个包解压到任意非中文目录下
目录说明:

  • bin:启动脚本
  • conf:配置文件

3.端口配置
Nacos的默认端口是8848,如果你电脑上的其它进程占用了8848端口,请先尝试关闭该进程。
如果无法关闭占用8848端口的进程,也可以进入nacos的conf目录,修改配置文件中的端口:
image

4.启动
启动非常简单,进入bin目录,结构如下:
然后执行命令即可:

  • windows命令:
     

5.访问

1.安装JDK
Nacos依赖于JDK运行,索引Linux上也需要安装JDK才行。
上传jdk安装包
上传到某个目录,例如:
然后解压缩:

 
 

设置环境变量:

 

2.上传安装包

上传到Linux服务器的某个目录,例如目录下:

 

然后删除安装包:

 

4.端口配置
与windows中类似
5.启动
在nacos/bin目录中,输入命令启动Nacos:

 

服务注册到nacos

 

如果存在Eureka依赖,注释掉原有的eureka依赖
2.添加nacos的客户端依赖:
客户端:

 

Nacos服务分级存储模型

image

userservice功能——》区域集群(上海、杭州)——》每个区域下多个的实例(userservice代码)

配置文件中加入集群设置:

 

cluster-name为集群名

NacosRule负载均衡(消费者调用生产者会优先调用同集群的生产者)

1、设置集群名称:

 

2、然后在消费者的yml文件中中设置负载均衡的IRule为NacosRule,这个规则优先会寻找与自己同集群的服务

 

3、注意将user-service的权重都设置为1,权重0-1,越大被访问的概率越大,权重设置为0则完全不会被访问(可以用来升级更新服务)

Nacos环境隔离

image

命名空间->分组->服务

  1. namespace用来做环境隔离
  2. 每个namespace都有唯-id
  3. 不同namespace下的服务不可见

实现:

 

Nacos与Eureka区别

1.Nacos与eureka的共同点

都支持服务注册和服务拉取

都支持服务提供者心跳方式做健康检测

2.Nacos与Eureka的区别

Nacos支持服务端主动检测提供者状态:临时实例采用心跳模式,非临时实例采用主动检测模式临时实例心跳不正常会被剔除,非临时实例则不会被剔除

Nacos支持服务列表变更的消息推送模式,服务列表更新更及时

Nacos集群默认采用AP方式,当集群中存在非临时实例时,采用CP模式;Eureka采用AP方式

Nacos配置管理

Nacos统一配置管理(先在Nacos中配置好配置文件)

image

image

微服务拉取上述Nacos配置

原理:

image

项目启动时会比读取application.yml更早读取bootstrap.yml文件,故而nacos配置文件的地址可以写在bootstrap.yml文件中

实现:

  1. 引入Nacos的配置管理客户端依赖:
 

因为在子项目中不用写版本号,在父项目的pom文件的依赖库中已经定义

  1. 在需要配置服务的项目中的resource目录添加一个bootstrap.yml文件,这个文件是引导文件,优先级高于application.yml:
 

校验代码(Controller中获取nacos中的配置文件):

 

效果:image

输出nacos中配置的字符串,成功获取到

配置优先级:
image

Feign

远程调用

  1. 导包
 
  1. 启动类加注解@EnableFeignClients
  2. 写Client接口
 
  1. Service中自动注入,调用

自定义配置

Feign的日志配置:

1.方式一:配置文件,feign.client.config.xxx.loggerLevel

①如果xxx是default则代表全局

②如果xxx是服务名称,例如userservice则代表某服务

2.方式二:java代码配置Logger.Level这个Bean

①如果在@EnableFeignClients注解声明则代表全局

②如果在@FeignClient注解中声明则代表某服务

性能优化

1.日志级别尽量用basic

2.使用HttpClient或OKHttp代替URLConnection

①引入feign-httpclient依赖

②配置文件开启httpClient功能,设置连接池参数

**实践

feign的**实践:

方式一:让controller和FeignClient继承同一接口

image

方式二:将FeignClient、POj0、Feign的默认配置都定义到一个项目中,供所有消费者使用

image

实现**实践:

抽取FeignClient:

实现**实践方式二的步骤如下:

1.首先创建一个module,命名为feign-api,然后引入feign的starter依赖

2.将order-service中编写的UserClient、User、DefaultFeignConfiquration都复制到feign-api项目中

3.在order-service中引入feiqn-api的依赖

4.修改order-service中的所有与上述三个组件有关的import部分,改成导入feiqn-api中的包

5.重启测试

出现问题:找不到生产者客户端,原因:生产者客户端已经被注入到feign服务中,解决方案如下:

SpringBootApplication的扫描包范围时,这些FeignClient无法使用。有两种方式解决:

版权声明


相关文章:

  • java基础面试 高级开发2024-10-25 16:10:02
  • 大学java基础知识树状图2024-10-25 16:10:02
  • java工作原理基础2024-10-25 16:10:02
  • Java循环基础作业2024-10-25 16:10:02
  • java基础安装教程2024-10-25 16:10:02
  • java 面向对象基础视频2024-10-25 16:10:02
  • 动力节点Java301集基础2024-10-25 16:10:02
  • java基础语法练习32024-10-25 16:10:02
  • 九章算法基础班java2024-10-25 16:10:02
  • JAVA面试题基础Map遍历循环2024-10-25 16:10:02