语雀地址:语雀pojo123
Maven通常使用dependencyManagement来执行版本号,只是声明依赖,并不实现引入,因此子项目要显示的声明需要引用的依赖
好处是:多个子项目都引用同样的依赖,则可以避免在每个使用的子项目里都声明一个版本号,这样在后续需要升级或者切换到另一个版本的时候,只需要在父容器里更新,而不需要在一个一个子项目的修改;另外如果某个子项目需要另外一个版本的时候,只需要声明version即可;
使用maven项目中闪电的图标进行操作,即可跳过test测试

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

流程:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<fork>true</fork>
<addResources>true</addResources>
</configuration>
</plugin>
</plugins>
</build>

Ctrl+Alt+Shift+/ 进入Rigistry进行下列配置,

RestTemplate提供了多种便捷访问远程Http服务的方法,是一种简单便捷的resful服务模板类,是Spring提供的用于访问Rest服务的客户端模板工具集
使用restTemplate访问resful接口非常简单粗暴。(url,requestMap,ResponseBean.class)这三个对象分别代表REST请求地址,请求参数,HTTP响应转换成的对象类型
系统中有重复的部分,将其重构
<!-- 引入自己定义的api通用包,可以使用payment-->
<dependency>
<groupId>com.pojo123.cloud</groupId>
<artifactId>cloud-api-commons</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
在传统的rpc远程调用框架中,管理每个服务与服务之间的依赖关系比较复杂,管理比较复杂,所以需要使用服务治理,管理服务与服务之间的依赖关系,可以实现服务调用、负载均衡、容错等,实现服务发现与注册;
Eureka提供服务注册服务:
各个微服务节点通过配置启动后,会在EurekaServer中进行注册,这样EurekaServer中的服务注册表中将会存储所有可用服务节点的信息,服务节点的信息可以在界面中直观的看到。
Eureka通过注册中心访问:
是一个Java客户端,用于简化Eureka Server的交互,客户端同时也具备一个内置的、使用轮询负载算法的负载均衡器。在应用启动后,将会向Eureka Server发送心跳,如果Eureka Server在多个心跳周期内没有接收到某个节点的心跳,EurekaServer将会从服务注册表中把这个服务节点移除(默认90s);
在服务项目的pom文件中加入以下服务依赖
<!-- eureka-server-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
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文件中加入以下eureka的客户端依赖;
<!-- eureka-client-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
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注解
和上述一样
支付服务启动后会把自身信息(比如服务地址以别名的方式注册进eureka),消费者order服务在需要调用接口的时候,使用服务别名去注册中心获取实际的RPC远程调用地址,消费者获取调用地址以后,底层实际上是利用HttpClient技术实现远程调用,消费者获取服务地址后悔缓存在本地JVM内存中,默认每隔30s更新一次服务调用地址;<br />**互相注册,相互守望**
127.0.0.1 eureka7001.com
127.0.0.1 eureka7002.com
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/
修改两个服务的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 #集群版
使用@LoadBalanced注解赋予RestTemplate负载均衡的能力,在config的RestTemplate配置中加上此注解
instance:
instance-id: payment8001
修改后暴露的服务名称发生变化

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

对于注册进eureka里面的微服务,可以通过服务发现来获得该服务的信息
@GetMapping(value="/payment/discovery")
public Object discovery(){
List<String> services = discoveryClient.getServices();//获取当前服务列表信息
for (String service : services) {
log.info("serivce"+service);
}
List<ServiceInstance> 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;
}
保护模式是用于一组客户端和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之后停更;