SpringCloud学习笔记——服务注册中心——Eureka
参考:尚硅谷2020最新版SpringCloud(H版&alibaba)——周阳
1. Eureka
单机版
-
创建子模块,子模块名称
cloud-eureka-server7001
-
pom依赖
<dependencies> <!--eureka-server--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> </dependency> <!-- 引入自己定义的api通用包,可以使用Payment支付Entity --> <dependency> <groupId>com.naclo</groupId> <artifactId>cloud-api-commons</artifactId> <version>${project.version}</version> </dependency> <!--boot web actuator--> <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.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <scope>runtime</scope> <optional>true</optional> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> </dependency> </dependencies>
-
创建application.yml
server: port: 7001 eureka: instance: hostname: localhost #eureka服务端的实例名称 client: register-with-eureka: false #false表示不向注册中心注册自己。 fetch-registry: false #false表示自己端就是注册中心,我的职责就是维护服务实例,并不需要去检索服务 service-url: defaultZone: http://${eureka.instance.hostname}.com:${server.port}/eureka/
-
创建主启动类EurekaMain7001
@SpringBootApplication @EnableEurekaServer public class EurekaMain7001 { public static void main(String[] args) { SpringApplication.run(EurekaMain7001.class, args); } }
-
启动测试,访问地址http://localhost:7001/
-
微服务提供者,支付模块入驻Eureka
-
添加pom依赖
<!--eureka-client--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency>
-
修改application.yml添加
eureka: client: #表示是否将自己注册进EurekaServer默认为true。 register-with-eureka: true #是否从EurekaServer抓取已有的注册信息,默认为true。单节点无所谓,集群必须设置为true才能配合ribbon使用负载均衡 fetchRegistry: true service-url: #单机版 defaultZone: http://localhost:7001/eureka
-
主启动类添加
@EnableEurekaClient
注解@SpringBootApplication @EnableEurekaClient public class PaymentMain8001 { public static void main(String[] args) { SpringApplication.run(PaymentMain8001.class, args); } }
-
运行,测试
-
-
微服务消费者,用户模块入驻Eureka
-
如上三步,添加配置
-
运行,测试
-
集群版
-
创建子模块,子模块名称
cloud-eureka-server7002
-
pom依赖
<dependencies> <!--eureka-server--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> </dependency> <!-- 引入自己定义的api通用包,可以使用Payment支付Entity --> <dependency> <groupId>com.naclo</groupId> <artifactId>cloud-api-commons</artifactId> <version>${project.version}</version> </dependency> <!--boot web actuator--> <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.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <scope>runtime</scope> <optional>true</optional> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> </dependency> </dependencies>
-
修改映射名称
打开
C:\Windows\System32\drivers\etc
下hosts文件在末尾添加映射
127.0.0.1 eureka7001.com 127.0.0.1 eureka7002.com 127.0.0.1 eureka7003.com
-
修改7001 application.yml
server: port: 7001 eureka: instance: hostname: eureka7001.com #eureka服务端的实例名称 client: register-with-eureka: false #false表示不向注册中心注册自己。 fetch-registry: false #false表示自己端就是注册中心,我的职责就是维护服务实例,并不需要去检索服务 service-url: defaultZone: http://eureka7002.com:7002/eureka/
-
修改7002 application.yml
server: port: 7002 eureka: instance: hostname: eureka7002.com #eureka服务端的实例名称 client: register-with-eureka: false #false表示不向注册中心注册自己。 fetch-registry: false #false表示自己端就是注册中心,我的职责就是维护服务实例,并不需要去检索服务 service-url: defaultZone: http://eureka7001.com:7001/eureka/
-
创建主启动类EurekaMain7002
@SpringBootApplication @EnableEurekaServer public class EurekaMain7002 { public static void main(String[] args) { SpringApplication.run(EurekaMain7002.class, args); } }
-
启动测试
-
访问地址http://eureka7001.com:7001
-
访问地址http://eureka7002.com:7002
-
-
两服务注册进集群
-
修改支付服务8001application.yml
#集群版 defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka
-
订单服务80修改application.yml
#集群版 defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka
-
启动,测试
-
访问地址http://eureka7001.com:7001
-
访问地址http://eureka7002.com:7002
-
get数据
发送:
http://localhost:80/consumer/payment/get/1
返回:
{"code":200,"message":"查询成功","data":{"id":1,"serial":"123456"}}
-
-
-
提供者8001集群搭建
-
子模块名称
cloud-provider-payment8002
-
pom依赖
<dependencies> <!--eureka-client--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> <dependency><!-- 引入自己定义的api--> <groupId>com.naclo</groupId> <artifactId>cloud-api-commons</artifactId> <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.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid-spring-boot-starter</artifactId> <version>1.1.10</version> </dependency> <!--mysql-connector-java--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency> <!--jdbc--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <scope>runtime</scope> <optional>true</optional> </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>
-
创建application.yml
server: port: 8002 spring: application: name: cloud-provider-payment datasource: type: com.alibaba.druid.pool.DruidDataSource # 当前数据源操作类型 driver-class-name: org.gjt.mm.mysql.Driver # mysql驱动包 url: jdbc:mysql://localhost:3306/springcloudstudy?serverTimezone=Asia/Shanghai&useSSL=true&useUnicode=true&characterEncoding=UTF-8 username: root password: root eureka: client: #表示是否将自己注册进EurekaServer默认为true。 register-with-eureka: true #是否从EurekaServer抓取已有的注册信息,默认为true。单节点无所谓,集群必须设置为true才能配合ribbon使用负载均衡 fetchRegistry: true service-url: #单机版 #defaultZone: http://localhost:7001/eureka #集群版 defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka mybatis: mapperLocations: classpath:mapper/*.xml type-aliases-package: com.naclo.entities # 所有Entity别名类所在包
-
创建主启动类PaymentMain8002
@SpringBootApplication @EnableEurekaClient public class PaymentMain8002 { public static void main(String[] args) { SpringApplication.run(PaymentMain8002.class, args); } }
-
拷贝其他文件 mapper,dao,service,controller
-
修改8001/8002的controller,添加
@Value("${server.port}") private String serverPort;
-
启动测试
- 访问地址http://eureka7001.com:7001
- 访问地址http://eureka7001.com:7001
-
修改controller地址为服务名称
public static final String PAYMENT_URL = "http://CLOUD-PROVIDER-PAYMENT";
-
RestTemplate添加
@LoadBalanced
注解,启用负载均衡@Configuration public class ApplicationContextConfig { @Bean @LoadBalanced public RestTemplate getRestTemplate() { return new RestTemplate(); } }
-
启动,测试
get数据
发送:
http://localhost:80/consumer/payment/get/1
返回:
{"code":200,"message":"查询成功,serverPort:8002","data":{"id":1,"serial":"123456"}}
或者
{"code":200,"message":"查询成功,serverPort:8001","data":{"id":1,"serial":"123456"}}
-
修改服务名称,修改application.yml添加
eureka: instance: instance-id: payment8002
-
显示IP地址,修改application.yml添加
eureka: instance: prefer-ip-address: true #访问路径可以显示IP地址
-
开启服务注册与发现
-
在主启动类PaymentMain8001添加注解@EnableDiscoveryClient
@SpringBootApplication @EnableEurekaClient @EnableDiscoveryClient public class PaymentMain8001 { public static void main(String[] args) { SpringApplication.run(PaymentMain8001.class, args); } }
-
修改controller
@Resource DiscoveryClient discoveryClient; @GetMapping(value = "/payment/discovery") public Object discovery() { List<String> services = discoveryClient.getServices(); for (String element : services) { log.info("*****element: " + element); } 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; }
-
测试
- 访问http://localhost:8001/payment/discovery
- 访问http://localhost:8001/payment/discovery
自我保护
-
现象
-
原因
- 某时刻某一个微服务不可用了,Eureka不会立刻清理,依旧会对微服务的信息进行保存。
-
禁止自我保护
-
修改7001的application.yml添加
eureka: server: #关闭自我保护机制,保证不可用服务被及时删除 enable-self-preservation: false eviction-interval-timer-in-ms: 2000
-
启动,测试
-
修改8001的application.yml添加
eureka: instance: #Eureka客户端向服务端发送心跳的时间间隔,单位为秒(默认是30秒) lease-renewal-interval-in-seconds: 1 #Eureka服务端在收到最后一次心跳后等待时间上限,单位为秒(默认是90秒),超时将剔除服务 lease-expiration-duration-in-seconds: 2
-
启动,测试:8001可以成功入驻7001
-
8001尝试测试出故障,关闭8001,服务两秒之后消失
-