Eureka服务中心的创建
1.创建一个maven模块
注意模块的位置
2.编写pom.xml文件
导入依赖
<dependencies>
<!--主要依赖,注意是server端的包-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
<dependency>
<!--先clean,再install打包,然后在这引入,引入自己定义的通用的api包-->
<groupId>com.tanzimo.com.tanzimo.springcloud</groupId>
<artifactId>cloud-api-commons</artifactId>
<!-- <version>1.0-SNAPSHOT</version>-->
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
3.编写application.yml文件
#设置Eureka服务中心的端口
server:
port: 7001
eureka:
instance:
hostname: localhost #eureka服务端的实例名称
client:
#false表示不向服务中心注册自己,因为自己就是服务中心
register-with-eureka: false
#false表示自己就是服务中心,我的职责就是维护服务实例,并不需要去检索服务
fetch-registry: false
service-url:
#设置与eureka server交互的地址 查询服务和注册服务都需要依赖的这个地址
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
4.编写主启动类
@SpringBootApplication
@EnableEurekaServer//这个注解表示自己是服务中心,由我来管理客户端的服务注册
public class EurekaMain7001 {
public static void main(String[] args) {
SpringApplication.run(EurekaMain7001.class, args);
}
}
改写Client客户端微服务提供者
前面写的文章有编写过Client客户端微服务提供者,这里进行改写
1.改写pom.xml文件
导入依赖
注意这里是client端的依赖包,上面才是server端
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
2.改写application.yml文件
添加新配置
eureka:
client:
#表示将自己是否注册到eureka server,默认为true,这里也应该为true,因为自己是提供者肯定要注册进去,与eureka服务中心发生关系
register-with-eureka: true
#是否从EurekaServer抓取已有的注册信息,默认为true。单节点无所谓,集群必须设置为true才能配合ribbon使用负载均衡
fetch-registry: true
serviceUrl:
#入住地址,也就是注册到前面创建的那个服务中心里
defaultZone: http://localhost:7001/eureka
3.改写主启动类
在主启动类上面添加一个注解就好了
@EnableEurekaClient:表示自己是客户端
@SpringBootApplication
@EnableEurekaClient
public class PaymentMain8001 {
public static void main(String[] args) {
SpringApplication.run(PaymentMain8001.class, args);
}
}
这时你可以启动一下项目看有没有报错再继续往下写,否则一路写到底万一有错也很难改,其次,注意模块的启动顺序,先启动服务中心server,再启动客户端client,这里有个前后关系,先有了服务中心,你才能去注册嘛,否则会找不到地址而出问题。启动之后会访问
localhost:7001你会发现下面已经显示有个服务注册在里面了,这样就表示成功了
改写Client客户端微服务消费者
也是一样,前面写的文章有编写过Client客户端微服务消费者,这里进行改写
1.改写pom.xml文件
导入依赖
org.springframework.cloud spring-cloud-starter-netflix-eureka-client2.改写application.yml依赖
eureka:
client:
#表示将自己是否注册到eureka server,默认为true,这里也应该为true,因为自己是提供者肯定要注册进去,与eureka发生关系
register-with-eureka: true
#是否从EurekaServer抓取已有的注册信息,默认为true。单节点无所谓,集群必须设置为true才能配合ribbon使用负载均衡
fetch-registry: true
serviceUrl:
#入住地址
defaultZone: http://localhost:7001/eureka
spring:
application:
name: cloud-order-service
3.改写主启动类
主启动类添加注解@EnableEurekaClient
现在就可以启动测试一下了启动之后访问localhost:7001就会发现有两个服务注册成功了
注意,服务之间的通讯还是要靠RestTemplate来支持,目前EurekaServer只是负责来管理显示服务的运行情况,状态信息啥的,跟里面服务之间的通讯没关系就相当于Eureka只是个可视化工具,我的理解是这样
Eureka集群的搭建
1.改写hosts文件
在C:\Windows\System32\drivers\etc此路径下的hosts文件
添加:(注意以管理员的方式打开,否则会因为权限不足不能修改,可以先设置打开记事本默认就是管理员打开,这样右键打开方式选择记事本就已经是管理员了)
127.0.0.1 eureka7001.com
127.0.0.1 eureka7001.com
2.再自己编写一个和7001一样的模块
3.编写两个服务中心的application.yml文件
7001的:
server:
port: 7001
eureka:
instance:
hostname: eureka7001.com #eureka服务端的实例名称
client:
#false表示不向注册中心注册自己
register-with-eureka: false
#false表示自己就是注册中心,我的职责就是维护服务实例,并不需要去检索服务
fetch-registry: false
service-url:
#设置与eureka server交互的地址 查询服务和注册服务都需要依赖的这个地址
#注意这里是7002,相互守望,相互注册
defaultZone: http://eureka7002.com:7002/eureka/
7002的:
server:
port: 7002
eureka:
instance:
hostname: eureka7002.com #eureka服务端的实例名称
client:
#false表示不向注册中心注册自己
register-with-eureka: false
#false表示自己就是注册中心,我的职责就是维护服务实例,并不需要去检索服务
fetch-registry: false
service-url:
#设置与eureka server交互的地址 查询服务和注册服务都需要依赖的这个地址
#注意这里是7001,相互守望,相互注册
defaultZone: http://eureka7001.com:7001/eureka/
4.改写提供者payment的application.yml文件
注册到两个服务中心,注意用逗号隔开
defaultZone: http://eureka7002.com:7002/eureka,http://eureka7001.com:7001/eureka/
4.改写消费者order的application.yml文件
注册到两个服务中心,注意用逗号隔开
defaultZone: http://eureka7002.com:7002/eureka,http://eureka7001.com:7001/eureka/
5.启动项目
注意一定要按顺序,先启动集群,再启动提供者,再启动消费者,不然提供者去找集群注册找不到会报错,url结尾要加/
6.开启负载均衡
@LoadBalanced//开启负载均衡
这样根据服务名称找提供者才不会迷路报错
controller:
public static final String PAYMENT_URL="http://CLOUD-PAYMENT-SERVICE";
//注意这里不再是"http://localhost:8001",而是"http://CLOUD-PAYMENT-SERVICE",选择是根据服务去找名字
return restTemplate.getForObject(PAYMENT_URL+"/payment/query/"+id, CommonResult.class);
@Configuration
public class ApplicationContextConfig {
@Bean
@LoadBalanced//开启负载均衡
public RestTemplate getRestTemplate(){
return new RestTemplate();
}
}
这个时候80端口order去找payment的时候会根据服务名去找,而我们的payment服务名一样,就会随机选择,而实现负载均衡
actuator信息完善
eureka:
instance:
instance-id: payment8001 #设置暴露的服务名
prefer-ip-address: true #访问路径可以显示ip地址
discovery服务发现
1.在controller注入,这个东东包含很多信息
import org.springframework.cloud.client.discovery.DiscoveryClient;注意啊,导包别导错了,导错了里面的方法都不一样
这个是接口
@Resource
private DiscoveryClient discoveryClient;
2.使用DiscoveryClient
@GetMapping("/payment/discovery")
public Object getDiscovery(){
EurekaClientConfig eurekaClientConfig = discoveryClient.getEurekaClientConfig();
String serverPort = eurekaClientConfig.getEurekaServerPort();
log.info("==============="+serverPort);
List<InstanceInfo> instances = discoveryClient.getInstancesById("CLOUD-PAYMENT-SERVICE");
for (InstanceInfo info : instances){
log.info(info.getInstanceId()+"==="+info.getHostName()+"==="+info.getPort()+"==="+info.getHomePageUrl());
}
return this.discoveryClient;
}
3.在主启动类添加注解
@EnableDiscoveryClient,开启discovery服务发现
4.有集群相互注册就都要启动
5.为什么有时候有的服务中心没有显示完全注册的提供者或消费者?
因为你是先启动了提供者,他会进行注册,要是有一个地主,就注册进去一个,有两个就注册进去两个假如你先启动提者,在启动对应的集群,可能在有的集群还没启动完全,提供者就已经完成注册了,此时有的服务中心就会缺少提供者或消费者
有个先后关系的懂吗
关闭自我保护机制
自我保护机制:客户端不向服务端发送心跳了,不会立刻移除客户端,而是会先保留,等待多少多少秒之后再删除
server端:
server:
#关闭自我保护机制,默认开启true
enable-self-preservation: false
eviction-interval-timer-in-ms: 2000 #2秒后就移除这个没心跳的客户端
client端:
#Eureka客户端向服务端发送心跳的时间间隔,单位为秒,默认30秒,也就是每30秒发送一次心跳,出故障了就发送不了了
lease-renewal-interval-in-seconds: 1 #1秒,发送的更频繁了
#Eureka服务端收到最后一次心跳的等待上限时间,默认是90秒,也就是说,等你90秒,要是90秒还不给心跳,就剔除你这个客户端
lease-expiration-duration-in-seconds: 2 #2秒,让你客户端死得更快