感谢大佬 “纯洁的微笑”,没少读大佬的文章,传道解惑方为真牛!
Eureka其实就是个服务注册中心,他的主要功能就是所有的微服务小弟要上岗之前,都来Eureka这里做一个注册,登记,然后Eureka大哥就知道每个小弟都是做什么的,在哪个地址可以找到,然后如果有的小弟需要什么服务也来这里,然后Eureka大哥告诉小弟需要的服务在什么地址。
微服务的主要目的就是每个服务崩了不影响别人,但是如果Eureka也崩了呢?所以单点还是很危险的,好在Eureka也可以相互注册,我们Eureka中心点至少做三个以上,这样才不会半夜起来加班。崩一个还可以撑到天亮。
还有一个问题就是,因为我用idea的编辑器,如果做微服务,一个微服务打开一个窗口,太麻烦了切过来切过去的,所以我们尝试一下,开启Run Dashboard管理 :
Run Dashboard 管理
1、找到workspace.xml
找到 RunDashboard节点,如果没有直接粘贴下面代码进去,然后重启idea
<component name="RunDashboard">
<option name="configurationTypes">
<set>
<option value="SpringBootApplicationConfigurationType" />
</set>
</option>
<option name="ruleStates">
<list>
<RuleState>
<option name="name" value="ConfigurationTypeDashboardGroupingRule" />
</RuleState>
<RuleState>
<option name="name" value="StatusDashboardGroupingRule" />
</RuleState>
</list>
</option>
</component>
这里可以查所有的版本对应:
网上说的是直接加上:
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka-server</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
但是加上老是找不到,爆红,网上说的是没有加版本号,但是加了也不行,看了报错:
Could not find artifact org.springframework.cloud:spring-cloud-starter-netflix-eureka-server:pom:2.2.1 in alimaven (http://maven.aliyun.com/nexus/content/groups/public/)
可能是 repository 仓库里没有,换个仓库试下。报这样的错误就两种可能,一个是仓库里没有这个版本号,另一个是仓库里整个都没有。
然后到现在我都没有解决.......
但是把maven 的setting.xml 改成这样,这是国内最快的maven仓库:
<mirrors>
<mirror>
<id>aliyunmaven</id>
<mirrorOf>*</mirrorOf>
<name>阿里云公共仓库</name>
<url>https://maven.aliyun.com/repository/public</url>
</mirror>
<mirror>
<id>aliyunmaven</id>
<mirrorOf>*</mirrorOf>
<name>阿里云谷歌仓库</name>
<url>https://maven.aliyun.com/repository/google</url>
</mirror>
<mirror>
<id>aliyunmaven</id>
<mirrorOf>*</mirrorOf>
<name>阿里云阿帕奇仓库</name>
<url>https://maven.aliyun.com/repository/apache-snapshots</url>
</mirror>
<mirror>
<id>aliyunmaven</id>
<mirrorOf>*</mirrorOf>
<name>阿里云spring仓库</name>
<url>https://maven.aliyun.com/repository/spring</url>
</mirror>
<mirror>
<id>aliyunmaven</id>
<mirrorOf>*</mirrorOf>
<name>阿里云spring插件仓库</name>
<url>https://maven.aliyun.com/repository/spring-plugin</url>
</mirror>
<mirror>
<id>aliyunmaven</id>
<mirrorOf>*</mirrorOf>
<name>阿里云grails-core</name>
<url>https://maven.aliyun.com/repository/grails-core</url>
</mirror>
<mirror>
<id>aliyunmaven</id>
<mirrorOf>*</mirrorOf>
<name>阿里云gradle-plugin</name>
<url>https://maven.aliyun.com/repository/gradle-plugin</url>
</mirror>
<mirror>
<id>aliyunmaven</id>
<mirrorOf>*</mirrorOf>
<name>阿里云mapr-public</name>
<url>https://maven.aliyun.com/repository/mapr-public</url>
</mirror>
</mirrors>
后面的解决方案是:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka-server</artifactId>
<version>1.4.2.RELEASE</version>
</dependency>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Hoxton.SR1</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
把这两个加进去,就好了,版本的话,就用上面那个查一下,版本对上。
2、添加启动代码中添加@EnableEurekaServer
注解
3、配置文件
在默认设置下,该服务注册中心也会将自己作为客户端来尝试注册它自己,所以我们需要禁用它的客户端注册行为,在application.properties
添加以下配置:
eureka.client.register-with-eureka=false
eureka.client.fetch-registry=false
eureka.client.serviceUrl.defaultZone=http://localhost:${server.port}/eureka/
但是出了这样的问题:
百度结果说版本不同,果然换了最新的版本就好了!!还是要好好看那个版本对应,springboot最恶心的地方就是版本对应。
然后运行程序:
eureka.client.register-with-eureka
:表示是否将自己注册到Eureka Server,默认为true。eureka.client.fetch-registry
:表示是否从Eureka Server获取注册信息,默认为true。eureka.client.serviceUrl.defaultZone
:设置与Eureka Server交互的地址,查询服务和注册服务都需要依赖这个地址。默认是http://localhost:8761/eureka ;多个地址可使用 , 分隔。
启动工程后,访问:http://localhost:8012/,可以看到下面的页面,其中还没有发现任何服务
这是因为就一个 Eureka 服务,再加几个我们试试。
出现这种问题就是因为只有一个服务,他自己的保护机制,我们再添加几个服务,晚上吧,要吃饭了 。
现在是第二天,哈哈,家里装修,开干!
idea里直接加一个模块就在项目地下了还挺方便,忽略红线,红线是因为pom里面没有加jar包,现在去改,还有一个问题,总项目里的pom.xml所引入的jar不能共享吗?
so,我们现在学习多模块!
大神的多模块学习!这个是多模块的,我们暂时先看下不用,因为我们需要单独启动每个模块,所以暂时先分割开,后面再学习,但是先说一下这个的感悟
---感觉其实就是总项目是parent,其他的对他做个依赖,在pom文件做个声明,然后后面就打包什么的也在里面了。哎,自学就这点不好,东西不系统,用到什么学什么,也学到最后最难的都用过,最简单的却叫不上名字。
我们现在每个项目模块分开写,分开启动。
现在是这样启动了三个项目,但是每个项目都没有相互注册,我们现在让她们相互注册。
--
spring:
application:
name: spring-cloud-eureka
profiles: peer1
server:
port: 8000
eureka:
instance:
hostname: peer1
client:
serviceUrl:
defaultZone: http://peer2:8001/eureka/,http://peer3:8002/eureka/
---
spring:
application:
name: spring-cloud-eureka
profiles: peer2
server:
port: 8001
eureka:
instance:
hostname: peer2
client:
serviceUrl:
defaultZone: http://peer1:8000/eureka/,http://peer3:8002/eureka/
---
spring:
application:
name: spring-cloud-eureka
profiles: peer3
server:
port: 8002
eureka:
instance:
hostname: peer3
client:
serviceUrl:
defaultZone: http://peer1:8000/eureka/,http://peer2:8001/eureka/
如果不是 .yml文件,可以用下面的,反正两个相同的就是 · 变成 = :
spring.application.name=spring-cloud-eureka-server-3
spring.profiles.active =peer3
server.port=8013
eureka.instance.hostname =peer3
eureka.client.register-with-eureka=false
eureka.client.fetch-registry=false
eureka.client.serviceUrl.defaultZone=http://peer2:8012/eureka/,http://peer1:8011/eureka/
这还有个详细的配置:
spring:
application:
name: eureka-server
profiles: dev
server:
# port: ${port:8761}
port: 8761
eureka:
instance:
# 实例id
instance-id: ${spring.application.name}-${port:8761}-${random.value}
# 服务名称,不配置的话取spring.application.name
appname: eureka-server
# 主机名,不配置的话根据操作系统的主机名来获取,
# 单机配置集群一定要配置,多台机器不用配置,默认会从系统中取
hostname: ${HOSTNAME}
# 发送心跳的间隔时间,默认30
lease-renewal-interval-in-seconds: 5
# 等待心跳包的时间上限,默认90
lease-expiration-duration-in-seconds: 10
# 在配置集群eureka时不能设置为true,默认为false,若为ture,eureka分片会显示不可用--->unavailable-replicas
prefer-ip-address: false
client:
# 从是否从注册中心中获取注册信息,集群模式下,配置为true
fetch-registry: true
# 是否将自身注册到注册中心,集群模式下配置为true
register-with-eureka: true
service-url:
# 与服务端通信的地址
defaultZone: ${EUREKA_SERVER_URL}/eureka/
# 将健康检查委托给actuator维护,默认为true
healthcheck:
enabled: true
server:
# 是否开启保护模式,开发环境建议为false,默认为true
enable-self-preservation: false
#当eureka服务器启动时获取其他服务器的注册信息失败时,会再次尝试获取,期间需要等待的时间,默认为30 * 1000毫秒
registry-sync-retry-wait-ms: 500
eviction-interval-timer-in-ms: 30000
# 集群里eureka节点的变化信息更新的时间间隔,单位为毫秒,默认为10 * 60 * 1000
peer-eureka-nodes-update-interval-ms: 30000
但是配置完启动变成了这样,我感觉是eureka 端口的问题
但是注册中心一直都是8080 最后的原因是:
改成:
好吧,继续翻山。
最后运行各个服务,效果截图如下:
但是点击 peer3却访问不到 locahost:8013,访问的是peer3:8013。这还是个坑一,还有就是发现了相邻的节点,但是却没有相互注册,所以,这可能是坑一的原因。
DS Replicas 是相邻的节点,发现了集群中其他的节点
Instance currently registered with eureka 意思是注册的节点,这个现在没显示,所以这个有问题。
笨死了,就是地址要写 /eureka/
要这样写:
spring:
datasource:
url: jdbc:mysql://localhost:3306/mdy
username: root
password: root
driverClassName: com.mysql.jdbc.Driver
application:
name: spring-cloud-eureka
profiles:
active: peer2
server:
port: 8012
eureka:
instance:
hostname: peer2
client:
register-with-eureka: true
fetch-registry: true
serviceUrl:
defaultZone: http://peer1:8011/eureka/,http://peer3:8013/eureka/
并且在C:\Windows\System32\drivers\etc中的host文件底部加上
127.0.0.1 peer1 分别对应两个Eureka的instance的hostname,
127.0.0.1 peer2
最终是这样;
这样 eureka 就完成了,所有的坑都在上面。