语雀地址:语雀pojo123
目录7.1项目初始化 Spring创建父工程方式:
- 7.1项目初始化
- Spring创建父工程方式:
- dependencyManagement和dependies的区别
- maven中跳过单元测试:
- 7.2Rest微服务工程构建
- 热部署
- RestTemplate:
- 工程重构
- 服务注册与发现
- Eureka服务注册与发现
- Eureka的两个组件
- Eureka服务端安装:
- 构建集群Euraka
- Eureka集群环境构建步骤
- actuator微服务信息完善
- 主机名称:服务名称修改
- 访问信息有IP信息提示
- 服务发现Discovery
- Eureka的自我保护
- 什么是自我保护
- 如何关闭自我保护
- 通过maven模板进行创建项目
- 整理环境
- 进入setting-File Encoding,调整字符编码
- 开启支持注解setting-Build-Anotations Processors:
- 设置java编译
Maven通常使用dependencyManagement来执行版本号,只是声明依赖,并不实现引入,因此子项目要显示的声明需要引用的依赖
好处是:多个子项目都引用同样的依赖,则可以避免在每个使用的子项目里都声明一个版本号,这样在后续需要升级或者切换到另一个版本的时候,只需要在父容器里更新,而不需要在一个一个子项目的修改;另外如果某个子项目需要另外一个版本的时候,只需要声明version即可;
使用maven项目中闪电的图标进行操作,即可跳过test测试

完成执行mvn:instal将父工程发布到仓库方便子工程继承
消费者80端口通过订单操作调用8001的支付模块

流程:
- 建module
- 改pom
- 写yaml
- 主启动
- 业务类
- 建表SQL
- entities
- dao
- service
- controller
- 测试
- Adding devtools to your project
org.springframework.boot spring-boot-devtools runtime true
- Adding plugin to your pom.xml(父工程)
org.springframework.boot spring-boot-maven-plugin true true
- Enabling automatic build (开启自动构建)

- update the value of:
Ctrl+Alt+Shift+/ 进入Rigistry进行下列配置,

- 重启IDEA
RestTemplate提供了多种便捷访问远程Http服务的方法,是一种简单便捷的resful服务模板类,是Spring提供的用于访问Rest服务的客户端模板工具集
使用restTemplate访问resful接口非常简单粗暴。(url,requestMap,ResponseBean.class)这三个对象分别代表REST请求地址,请求参数,HTTP响应转换成的对象类型
系统中有重复的部分,将其重构
- 新建module
- 修改pom文件
- 新增公共entities
- maven命令clean install,将其打包放到本地maven仓库给其它服务使用
- 删除项目原先有过的entities 文件夹
- 引入仓库中之前打包好的文件
服务注册与发现com.pojo123.cloud cloud-api-commons 1.0-SNAPSHOT
在传统的rpc远程调用框架中,管理每个服务与服务之间的依赖关系比较复杂,管理比较复杂,所以需要使用服务治理,管理服务与服务之间的依赖关系,可以实现服务调用、负载均衡、容错等,实现服务发现与注册;
Eureka提供服务注册服务:
各个微服务节点通过配置启动后,会在EurekaServer中进行注册,这样EurekaServer中的服务注册表中将会存储所有可用服务节点的信息,服务节点的信息可以在界面中直观的看到。
Eureka通过注册中心访问:
是一个Java客户端,用于简化Eureka Server的交互,客户端同时也具备一个内置的、使用轮询负载算法的负载均衡器。在应用启动后,将会向Eureka Server发送心跳,如果Eureka Server在多个心跳周期内没有接收到某个节点的心跳,EurekaServer将会从服务注册表中把这个服务节点移除(默认90s);
- IDEA生成EurekaServerdaunt服务注册中心
- 建module
- 改pom
在服务项目的pom文件中加入以下服务依赖
org.springframework.cloud
spring-cloud-starter-netflix-eureka-server
- 写yml
server:
port: 7001
eureka:
instance:
hostname: localhost #eureka服务端实例名称
client:
register-with-eureka: false # 不允许向注册中心注册自己
fetch-registry: false #表示自己就是注册中心,职责就是维护服务实例,并不需要去检索服务
service-url:
#设置与Eureka Server交互的地址查询服务和注册服务都需要依赖这个地址
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
- 主启动
在主启动类中加入@EnableEurekaServer注解,表明这里是一个Eureka的服务中心
-
测试
-
将支付服务8001注册到服务中心
- 改pom文件
在pom文件中加入以下eureka的客户端依赖;
org.springframework.cloud
spring-cloud-starter-netflix-eureka-client
b. 修改yml文件
eureka:
client:
#表示是否将自己注册金EurekaServer,默认为true
register-with-eureka: true
#是否从EurekaServer抓取已有的自己的注册信息,默认为true,单节点无所谓,集群必须先设置为true才能配合ribbon使用负载均衡
fetch-registry: true
service-url:
defaultZone: http://localhost:7001/eureka
c. 在主启动文件中加入@EnableEurekaClient注解
- 将消费者服务8080注册进EurekaServer称为服务消费者
和上述一样
构建集群Euraka支付服务启动后会把自身信息(比如服务地址以别名的方式注册进eureka),消费者order服务在需要调用接口的时候,使用服务别名去注册中心获取实际的RPC远程调用地址,消费者获取调用地址以后,底层实际上是利用HttpClient技术实现远程调用,消费者获取服务地址后悔缓存在本地JVM内存中,默认每隔30s更新一次服务调用地址;Eureka集群环境构建步骤
**互相注册,相互守望**
- 仿照7001EurekaServer新建7002EurekaServer
- 添加映射配置到hosts文件
127.0.0.1 eureka7001.com 127.0.0.1 eureka7002.com
- 修改yml文件,相互注册,仿照7001,如下所示
server:
port: 7001
eureka:
instance:
hostname: eureka7001.com #eureka服务端实例名称
client:
register-with-eureka: false # 不允许向注册中心注册自己
fetch-registry: false #表示自己就是注册中心,职责就是维护服务实例,并不需要去检索服务
service-url:
#设置与Eureka Server交互的地址查询服务和注册服务都需要依赖这个地址
defaultZone: http://eureka7002.com:7002/eureka/
- 将支付服务8001微服务发布到上面两台Eureka集群配置中
- 将订单服务8080微服务发布到上面两台Eureka集群配置中
修改两个服务的application.yml文件,如下所示,将服务地址改为集群中的两个地址
eureka:
client:
#表示是否将自己注册金EurekaServer,默认为true
register-with-eureka: true
#是否从EurekaServer抓取已有的自己的注册信息,默认为true,单节点无所谓,集群必须先设置为true才能配合ribbon使用负载均衡
fetch-registry: true
service-url:
# defaultZone: http://localhost:7001/eureka
defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka #集群版
- 支付服务提供者8001集群环境构建
- 参考8001服务提供新建服务
- 负载均衡
使用@LoadBalanced注解赋予RestTemplate负载均衡的能力,在config的RestTemplate配置中加上此注解
actuator微服务信息完善 主机名称:服务名称修改instance:
instance-id: payment8001
修改后暴露的服务名称发生变化

instance:
instance-id: payment8001
prefer-ip-address: **true **#访问路径可以显式IP地址
修改后点击路径有ip地址显示

对于注册进eureka里面的微服务,可以通过服务发现来获得该服务的信息
- 用8001进行实验,编写接口,进行自测
@GetMapping(value="/payment/discovery")
public Object discovery(){
List services = discoveryClient.getServices();//获取当前服务列表信息
for (String service : services) {
log.info("serivce"+service);
}
List instances = discoveryClient.getInstances("CLOUD-PAYMENT-SERVICE");
for (ServiceInstance instance : instances) {
log.info(instance.getServiceId()+"t"+instance.getHost()+"t"+instance.getPort()+"t"+instance.getUri());
}
return this.discoveryClient;
}
- 在启动类上加入@EnableDiscoveryClient 注解
保护模式是用于一组客户端和Eureka Server之间存在网路分区场景下的保护,一旦进入保护模式,Eureka Server将会尝试保护其服务注册表中的信息,不再删除服务注册表中的数据,也就是不会注销任何微服务;
就是说:某时刻某一个服务不可用了,Eureka不会立刻清理,依旧会对该微服务的信息进行保存;
属于CAP里面的AP分支

在server方配置文件中添加以下配置
eureka:
server:
#关闭自我保护机制,保证不可用服务及时被踢出
enable-self-preservation:false
eviction-interval-timer-in-ms:2000 #设置心跳时间为2s
在client方配置文件添加以下配置
#Eureka客户端向服务器发送心跳的时间间隔,单位为s(默认30s) lease-renewal-interval-in-seconds:1 #Eureka服务端在收到最后一次心跳后等待时间上限,单位为s,超时将剔除服务 lease-expiration-duration-in-seconds:2
Eureka2.0之后停更;



