文章目录
IDEA进行服务复制
Idea的Service/rundashboard
我们再使用负载均衡的时候需要多个服务
Idea中可以通过service来复制一个微服务
idea版本
我使用的版本是2020.1.1,service窗口中可以以配置方式启动微服务,一般是配置不同端口号启动。如下图。
(但是在旧版本中,对应的窗口叫做Run Dashboard窗口,旧版本的解决办法网上文章很多,请自行查找。)
我的Idea版本比较低,所以Run Dashboard
复制微服务,修改端口,因为端口重复会冲突
设置一些配置即可
端口号,项目名等
配置端口号
-Dserver.prot=8891
开启rundashboard
有的时候发现IDEA中没有RundashBoard,所以需要进行配置一下
这里可以通过IDEA的ctrl+f进行查找
<option name="configurationTypes">
<set>
<option value="SpringBootApplicationConfigurationType" />
</set>
</option>
引入这段内容之后,重启服务即可
工程重构
因为我们在多个子模块中难免出现相同的类
- 比如说操作数据库的时候,多个模块之间的实体类,mapper类等都会出现重复的
- 我们就可以通过Maven提取出一个公共的模块。
- 其他模块进行引用该模块。实现代码的降低重复度
创建公共模块
pom中指定该模块位置
<?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">
<parent>
<artifactId>SpringCloudStu</artifactId>
<groupId>SpringCloudStu</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<!--这里是为这个模块指定位置-->
<!--可以将这个位置发送给其他模块-->
<artifactId>moduleMore</artifactId>
<groupId>moduleMore</groupId>
<version>1.0-SNAPSHOT</version>
</project>
编写其他类
这些类作为公共访问的 实体类等
public class UserModule {
public String name;
public int age;
}
其他模块引用
在需要该模块类的模块pom中引入
这里编写的依赖是自己编写的模块位置
进行指定就可以访问该模块的类了
<dependency>
<artifactId>moduleMore</artifactId>
<groupId>moduleMore</groupId>
<version>1.0-SNAPSHOT</version>
</dependency>
package cn.controller;
import cn.pojo.UserModule;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
public class OneController {
@RequestMapping("/oneShow")
@ResponseBody
public String oneShow(){
// 自己模块本身不存在该类,这个类是从其他 模块 位置获取的
new UserModule();
return "show";
}
}
Eureka(注册中心)
学习微服务一定要了解的东西。现在Eureka是我们在刚接触的时候最适合学习的。
Eureka基础概念
什么是服务治理
Spring Cloud 封装了 Netflix 公司开发的 Eureka 模块来实现服务治理
在传统的rpc远程调用框架中,管理每个服务与服务之间依赖关系比较复杂,管理比较复杂,所以需要使用服务治理,管理服务于服务之间依赖关系,可以实现服务调用、负载均衡、容错等,实现服务发现与注册
服务注册和发现
Eureka是一个cs 设计架构,存在服务端和客户端。
Eureka Server 作为服务注册功能的服务器,它是服务注册中心。
其他微服务,使用 Eureka的客户端连接到 Eureka Server并维持心跳连接。这样系统的维护人员就可以通过 Eureka Server 来监控系统中各个微服务是否正常运行。
- 服务端开启
- 客户端向服务端注册,并定时接收心跳。判断服务是否还健康
服务端和消费端
Eureka包含两个组件:Eureka Server和Eureka Client
Eureka Server提供服务注册服务
各个微服务节点通过配置启动后,会在EurekaServer中进行注册,这样EurekaServer中的服务注册表中将会存储所有可用服务节点的信息,服务节点的信息可以在界面中直观看到。
EurekaClient通过注册中心进行访问
是一个Java客户端,用于简化Eureka Server的交互,客户端同时也具备一个内置的、使用轮询(round-robin)负载算法的负载均衡器。在应用启动后,将会向Eureka Server发送心跳(默认周期为30秒)。如果Eureka Server在多个心跳周期内没有接收到某个节点的心跳,EurekaServer将会从服务注册表中把这个服务节点移除(默认90秒)
添加服务端
建module,导入依赖,编写yaml,主程序,其他组件
这里的服务端,是为了其他服务的客户端注入
最终的Eureka服务端结构
引入依赖
<!--该注解才是Eureka服务端的主要依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
<!--针对于SpringBoot的MVC操作-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--针对与SpringBoot的监控-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!--用于热部署的依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
yaml配置
server:
port: 7001
# Eureka配置
eureka:
instance:
# Eureka服务端的实例名字
hostname: 127.0.0.1
client:
# 表示是否向 Eureka 注册中心注册自己(这个模块本身是服务器,所以不需要)
register-with-eureka: false
# fetch-registry如果为false,则表示自己为注册中心,客户端的化为 ture
fetch-registry: false
# Eureka监控页面~
service-url:
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
主启动
@SpringBootApplication
//在主启动中开始eureka服务端
@EnableEurekaServer
public class EurekaMain {
public static void main(String[] args) {
SpringApplication.run(EurekaMain.class,args);
}
}
结果页面
客户端入注册服务端
添加pom依赖
<!--eureka的客户端依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
yaml添加
server:
port: 8881
# Eureka配置:配置服务注册中心地址
eureka:
client:
service-url:
defaultZone: http://localhost:7001/eureka/
instance:
# 改变了展示的路径
instance-id: moduleOne
#为微服务取名字
spring:
application:
name: moduleOneprovider # 表示服务的提供者
spring-application-name
这个名字很重要。我们通过RestTemplate的时候通过指定的路径进行访问。下面我们就可以通过该微服务名称进行访问。
多个微服务可以使用同一个名称,在调用名称的时候可以进行负载均衡
主启动
//主启动
@SpringBootApplication
@EnableEurekaClient
public class ModuleOne {
public static void main(String[] args) {
SpringApplication.run(ModuleOne.class,args);
}
}
注册中心查看存在一个服务
Eureka工作流程
修改127.0.0.1
再我们访问本地页面的时候,一般都是localhost或者是127.0.0.1
下面的配置,可以让我们自定义
开始
C:\Windows\System32\drivers\etc
进入这个目录
修改hosts文件
这个东西不要乱动,会出现很多错误的(要小心)
下面可以使用设定好的代替127.0.0.1
看到确实可以使用wsl来代替
当修改文件的时候权限不够
我第一次再修改的时候权限不够,改完之后不给保存
可以先将hosts文件转换为txt格式
使用记事本管理员方式
修改完之后再txt文本换回去
Eureka的服务端集群
我们如果注册中心只有一个的话,当这一个注册中心宕机了
那么其他服务之间也就获取不了对方了。所以我们需要搭建集群避免出现错误
高可用:说的就是集群操作
互相注册,相互守望
操作
想要搭建Eureka集群就需要在创建一个Eureka的服务端
或者多个服务端。
多个Eureka的服务端基本上操作都是一样的。只需要修改多个和Eureka的配置文件。进行指定其他的Eureka即可
yaml配置
service-url:
defaultZone: 多个Eureka服务地址,多个之间使用逗哈隔开
测试
server:
port: 7001
# Eureka配置
eureka:
instance:
# Eureka服务端的实例名字
hostname: eureka7001
client:
# 表示是否向 Eureka 注册中心注册自己(这个模块本身是服务器,所以不需要)
register-with-eureka: false
# fetch-registry如果为false,则表示自己为注册中心,客户端的化为 ture
fetch-registry: false
# Eureka监控页面~
service-url:
defaultZone: http://wsl:7002/eureka/
server:
port: 7002
# Eureka配置
eureka:
instance:
# Eureka服务端的实例名字
hostname: eureka7002
client:
# 表示是否向 Eureka 注册中心注册自己(这个模块本身是服务器,所以不需要)
register-with-eureka: false
# fetch-registry如果为false,则表示自己为注册中心,客户端的化为 ture
fetch-registry: false
# Eureka监控页面~
service-url:
defaultZone: http://127.0.0.1:7001/eureka/
- 发现我们明明没有在其他微服务客户端中指定注册到那个Eureka服务端。但是两方都存在Eureka客户端。
- 并且对方的集群中显示对方。
表示集群搭建成功
鼠标放在上面可以展示指定的集群位置
客户端可以进行修改
Eureka客户端通过yaml指定多个Eureka服务端
有的版本可能不需要去指定,客户端连接一个Eureka服务端。
因为集群就满足了其他服务端也可访问
service-url:
defaultZone: 多个Eureka服务地址,多个之间使用逗哈隔开
Eureka客户端的集群
前面我们配置了服务端的集群。下面就需要创建多个客户端集群
再次创建一个Eureka客户端
#为微服务取名字
spring:
application:
name: # 表示服务的提供者
只要指定多个Eureka客户端的服务名称相同,就表示Eureka客户端符合集群
IDEA中我们可以通过RunDashboard克隆微服务
克隆一个微服务集群后
- 这两个因为端口号等我们需要一个一个配置。我不同同时启动
- 只要我们一个一个启动。在启动之前更改主体的代码。
- 谁启动,谁就运行主体的代码
这个期间避免热部署,自动更新,先将热部署的部分去掉
通过IDEA完成Eureka客户端的服务克隆了
使用Module2调用Module1的集群
以往我们在调用的时候通过写死请求的地址。当然我们之后肯定不能写死。
下面讲Module2注册到注册中心。进行负载均衡操作
可以看到现在
- Module1是集群存在两个
- Module2是消费者调用两个Module1
这一步省略
对RestTemplate进行修改
Module2的主启动类
//主启动
@SpringBootApplication
@EnableEurekaClient
public class ModuleTwo {
public static void main(String[] args) {
SpringApplication.run(ModuleTwo.class,args);
}
// 因为主启动类也是一个 SpringBoot的配置类
// 我们通过配置类 像容器中添加一个 RestTemplate组件
// 可以进行远程访问 restful请求
@Bean
@LoadBalanced
public RestTemplate restTemplate(){
return new RestTemplate();
}
}
Module2的调用Eureka的客户端集群
@Controller
public class TwoController {
// 获取RestTemplate组件
@Autowired
private RestTemplate restTemplate;
// 添加请求
@RequestMapping("twoshow")
@ResponseBody
public String twoShow() {
// 在module2 中 通过RestTemplate 调用指定的请求
// 这里发现没有指定准确的ip地址。而是以服务名称代替
String forObject = restTemplate.getForObject("http://moduleOneprovider/one", String.class);
return "调用module1返回的结果:" + forObject;
}
}
同一个请求,因为底层访问的Eureka客户端不同,产生不同的结果