来源:////
1. 微服务基础知识 1. 什么是微服务?
官网:(我个人的建议是使用谷歌浏览器访问官网,打开中文翻译,大致阅读官网)
个人理解:
以前的服务器就像一位会说英语、数学和其他语言的全能老师,为学生提供服务。如果老师生病了,整个学校就会停课。现在微服务已经普及,学校设有数学教研组、语文教研组、外语教研组。每个教研组都有一批教师,专门负责某一学科的教学。没有人,学校照样运转。
在这次改变中,那些改变历史的程序员将一台服务器中的众多服务,或者几台服务器中的众多服务进行了分类和解耦,将它们相似的功能交给了同一个集群。将相互耦合的功能分离出来,按照业务和功能作为微服务放在服务器上,而这个服务器只提供一项服务,或者更少的服务。让一个非常大的服务逻辑解耦成小的服务,均匀分布在各自的服务器上。微服务就在这里。
每个教研组都是一个微服务集群。他们提供的服务是一样的,注册中心就是存放这个教研组教师名单的地方。学生要先访问这个注册中心获取教师列表,然后根据相应的加载方式访问各自的教师。不会让集群中的某个老师累死,也不会让某个老师懒死。
Zuul网关是学校的看门人。它负责引导(路由)某些学生来学校找谁,通过一些很简单的配置,可以阻止某些人进入(身份验证),或者控制那些想学数学的人。只能去数学教研组,不能去核能教研组学习如何造原子弹(权威验证)。
至于导火索,你可以把它想象成学校志愿者。当教研组罢工,学生找不到老师时,这些志愿者可以及时告诉来访的学生相应的结果、异常信息等,避免大量学生在学校等待。这些志愿者很快就对这些等待的学生进行了整理。如果学生一直在学校等待,其他需要学生的学校也会等待学生,最终造成学校大面积瘫痪。在这里我们把学生当作请求。导火索就是切断事故的蔓延。
当然,这些组件也是微服务,需要到注册中心进行注册。
那么就可以算是这个学校了。上面提到的很多组成部分就相当于这个学校的各个职能部门。
2、微服务构建
ps:博主基于+idea构建的。
另外,还需要以建设为基础。
引入Boot相关依赖:这里使用的是1.5.7版本;引入相关依赖:这里是.SR5
2.1 项目初始化配置
在Idea中创建项目:文件->新建->
单击->下一步
项目命名->项目位置
选择模块->下一步
进入新窗口后,开始配置,打开设置
因为我之前已经做过配置,所以只需要更改box 1的路径即可。对于第一个配置,我需要找到你放置它的位置,以及.xml的位置。确实无法集成百度idea。
选择3个框后,单击“确定”
接下来创建一个新的
可能存在无法加载列表的问题。
我尝试了网上所有的解决方案,花了3个小时才解决,但还是不行。重新启动后,它起作用了......你相信吗? ? ? ? ?小时候网吧管理员的至理名言我都忘记了! !重新启动吧! !
出来后选择->下一步
想好名称后,将其复制并单击“下一步”。您还可以为该组织想一个名称。一般情况下,公司URL是倒写的。
粘贴后下一步
提供注册服务的服务器的pom.xml配置如下:
"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">
4.0.0
com.yun
springcloud-eureka-server
1.0-SNAPSHOT
springcloud-eureka-server
http://www.example.com
UTF-8
1.7
1.7
org.springframework.boot
spring-boot-starter-parent
1.5.7.RELEASE
org.springframework.cloud
spring-cloud-starter-netflix-eureka-server
org.springframework.cloud
spring-cloud-dependencies
Edgware.SR5
pom
import
点击
右下角等待依赖加载
2.2 提供注册服务的构建和服务配置
创建文件夹
并设置为资源根目录,然后文件就变成这样了
然后该文件夹将变成黄色水平条
下面新建一个文件,文件名为.yml(是的,是yml,不是xml,博主刚开始学习的时候还以为其他博主搞错了,踩了个小坑)
配置yml。注意:如果只配置前两行端口号信息,会报错。
port: 8700 # 端口自己决定
# 指定当前eureka客户端的注册地址,也就是eureka服务的提供方,当前配置的服务的注册服务方
eureka:
client:
service-url:
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka
register-with-eureka: false #自身 不在向eureka注册
fetch-registry: false #启动时禁用client的注册
instance:
hostname: localhost
#指定应用名称
spring:
application:
name: eureka-server
知识补充:
开发的入门类ion.java
离子Java
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
@SpringBootApplication
@EnableEurekaServer //当前使用eureka的server
public class EurekaServerApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaServerApplication.class,args);
}
}
右键运行当前类:
运行成功画面
尝试用yml中配置的端口号进入管理界面(你设置的端口号需要大于公共和保留端口号)1024~
一般我喜欢设置在8700到8800之间
您现在可以登录以下管理界面。
2.3 配置提供真实服务的客户端的角色,其提供的服务需要在服务注册方(注册中心)注册
同样创建一个新的,选择并单击下一步
将两个位置留空
命名的下一步
请注意,该模块需要在根目录中创建。默认情况下,Root 会在前一个模块下创建该模块。这样的话,创建模块的时候就会出现问题,报错。
建议在root下使用此配置方法,然后如下图更改名称。配置并单击下一步。红框一般默认为上一个模块的文件目录名。需要将其更改为您的模块名称。
成功后,将处于并行状态。如果不并联或者报错,请重新配置。
配置的pom与pom配置相同。只需要将第一个pom的1个框改为
和第一个微服务一样,我们需要配置入口类pom.xml.yml。因为是服务提供者,所以我们这里还需要写一个服务类。
.yml
port: 8701 # 服务提供方
# 指定当前eureka客户端的注册地址,
eureka:
client:
service-url:
defaultZone: http://${eureka.instance.hostname}:8700/eureka
instance:
hostname: localhost
#当前服务名称
spring:
application:
name: eureka-service
pom.xml:
提供写作服务:
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/Hello")
public class Controller {
@RequestMapping("/World")
public String helloWorld(String s){
System.out.println("传入的值为:"+s);
return "传入的值为:"+s;
}
}
进入类并运行这个微服务:
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
@SpringBootApplication
@EnableDiscoveryClient//代表自己是一个服务提供方
public class EurekaServiceApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaServiceApplication.class,args);
}
}
右键入口类名,点击运行(当然打开这个服务的时候需要先打开该服务,也就是我们写的第一个微服务)
现在进入服务注册页面:8700/
可以看到服务提供者已经在服务注册者中注册了
直接访问服务提供商的网络位置:8701//?s=小PEi
我们看到可以访问,证明这个微服务是可用的。
但我们一般不会直接调用所需的微服务,而是通过提供注册服务的服务器获取所需的服务提供者列表(包含可以提供相应服务的服务器的列表)。它们可能是一个簇。 ,因此将返回一个 IP + 端口号表。服务消费者通过相应的算法访问这张表上的不同服务器。这些服务器提供相同的服务。这种选择服务器为自己服务的方式,也是服务消费者选择服务器为自己服务的方式。客户端负载平衡。
目前,博主知道有两种方式访问这些服务器:轮询和随机。轮询意味着循环。如果有3台服务器,则访问方式为1,2,3,1,2,3,1,2。 3···,随机就是随机,回忆一下方法,不规则的方式。这两种方法都是为了使访问每台服务器的可能性尽可能相等。还有一种算法叫加权负载,就是根据服务器的负载能力来分配相应的服务。能力强的人做得更多。能力小的人做事就少。
2.4 如何调用服务
第一种调用方式:+
第二种调用方法:
2.4.1+
它是一个负载平衡客户端。它是什么?请仔细阅读
您可以看到其中的一部分,如下所示:
客户端负载均衡和服务器负载均衡最大的区别在于上面提到的服务列表的存储位置。在客户端负载均衡中,所有的客户端节点都会维护一个自己想要访问的服务器列表,这些服务器列表来自于服务注册中心,比如我们在上一章介绍的服务器。与服务器端负载均衡架构类似,客户端负载均衡也需要心跳来维护服务器列表的健康状况。默认情况下,会创建每个服务治理框架的自动化集成配置,例如 flix...in org...。在实际使用中,我们可以查看这两个类的实现,找到它们的配置细节,以帮助我们更好的使用。
接下来我们将基于它构建一个客户端,用于消费服务。
同样,先搭建环境
与之前构建的区别在于:
第1步:现在需要在pom中添加依赖
org.springframework.cloud
spring-cloud-starter-ribbon
步骤2:yml配置如下:
port: 8702 # 服务消费方
# 指定当前eureka客户端的注册地址,
eureka:
client:
service-url:
defaultZone: http://${eureka.instance.hostname}:8700/eureka
instance:
hostname: localhost
#当前服务名称
spring:
application:
name: eureka-consumer
服务的消费者仍然需要在注册者的8700端口进行注册,配置当前服务消费者的8072端口,名称为-
第三步:你仍然需要启动类,因为它是一个结构体:
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
@SpringBootApplication
@EnableDiscoveryClient //当前使用eureka的server
public class EurekaConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaConsumerApplication.class,args);
}
}
如上图:
我们需要一个类来编写代码。
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.loadbalancer.LoadBalancerClient;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
@RestController
@RequestMapping("/Hello")
class ConsumerController {
@Autowired
private LoadBalancerClient loadBalancerClient;
@Autowired
private RestTemplate restTemplate;
@RequestMapping("/Consumer")
public String helloWorld(String s){
System.out.println("传入的值为:"+s);
//第一种调用方式
//String forObject = new RestTemplate().getForObject("http://localhost:8071/Hello/World?s=" + s, String.class);
//第二种调用方式
//根据服务名 获取服务列表 根据算法选取某个服务 并访问某个服务的网络位置。
//ServiceInstance serviceInstance = loadBalancerClient.choose("EUREKA-SERVICE");
//String forObject = new RestTemplate().getForObject("http://"+serviceInstance.getHost()+":"+serviceInstance.getPort()+"/Hello/World?s="+s,String.class);
//第三种调用方式 需要restTemplate注入的方式
String forObject = restTemplate.getForObject("http://EUREKA-SERVICE/Hello/World?s=" + s, String.class);
return forObject;
}
}
我们经常使用第三种调用方式。
第一种是直接调用:直接访问,无需通过注册中心的服务列表。
第二种是根据服务名称选择呼叫。如上图所示,需要进行如下注入。
@;
如上面代码中第二种调用方式的代码所示。
使用服务名称前往注册中心获取服务列表。当前客户端底层会使用随机算法来选择服务并访问。
第三种需要自动注入@Bean注解,直接调用对象来调用服务。底层调用方式与第二种调用方式相同。如下:
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;
@Configuration
public class Beans {
//管理简单对象
@Bean
@LoadBalanced
public RestTemplate getRestTemplate(){
return new RestTemplate();
}
}
@Bean注解告诉工厂这个方法需要自动注入。
@,表示需要负载均衡。
然后将其注入并使用它。不同的是,您可以直接使用服务名称来访问它。
= .("" + s, .);
开始测试:
1.运行启动类:
2.运行启动类:
3.运行启动类:
浏览器访问:
8072是服务消费者的端口
访问方法分析:
2.5 的高可用性配置
点击下图进行配置
接下来配置三台虚拟机01、02、03的参数。
01:8699
02:8698
03:8697
然后点击确定保存,你会看到另外三个启动项。
接下来更改注册端口号并分别启动三个启动项。
打开yml配置,删除端口号配置前两行(图中有错误,请删除 和 那两行)
配置好yml后,点击启动
同理,我们再次将端口号更改为8699和8697后,将启动项更改为02,然后启动(图中有错误,请删除 和 行)
同理,将yml端口改为8699和8698后,将启动项改为03,然后启动(图中有错误,请把 和 行删掉)
启动后分别访问01、02、03三个端口,已经可以看到可以访问了。
打开服务提供者的yml配置如下,将端口号改为三个之一。
启动服务提供者后,再次访问三个01、02、03,我们会发现
关键点:即使服务商只注册了一个端口号8699,其他两个端口号也能感知到服务商8701的存在。如下图:
接下来,将服务注册者的端口号添加到服务消费者中,这样当其中任何一个挂掉时,其他人也可以获得服务列表。
访问如下服务消费者,发现可以通过消费者调用服务列表并访问
我们可以关闭其中两个副本,重新启动它们,然后再次访问它们。您必须重新启动才能清除缓存并清除其中的服务列表。
上图显示,即使关闭两台电脑后,仍然可以访问。如下图所示,服务列表还是从中获取。从中也可以看出,不再需要获取服务列表了。
但是当我们把一切都关掉的时候。访问还是没问题,因为服务列表有缓存。
但让我们重新启动它,这样它就不会再工作了。
至此,我们就完成了高可用的配置
设置好后别忘了点赞哦~喜欢哦~喜欢哦~