Spring之微服务
一. Spring之微服务
1.微服务架构的基础框架、组件
- 服务注册发现
- 服务网关
- 后端通用服务
- 前端服务 又称为边缘服务
2.两大配方
Dubbo
Zookeeper
SpringMVC or spirngboot
Spring Cloud:
Spring cloud Netflix eureka
Spring boot
3.Spring Cloud是什么
是一个开发工具集,含了多个子项目
主要是基于NETFLIX开源组件的进一步封装
简化了分布式开发
掌握如何使用,更要理解分布式,架构的特点
4.spring cloud eureka
基于netflix eureka做了二次封装
两个组件组成:
Eureka server注册中心
Eureka client 服务注册
5.注册中心实践
Eureka server (eureka找到了,有了的意思)
@SpringBootApplication
@EnableEurekaServer
public class Eureka002Application {
public static void main(String[] args) {
SpringApplication.run(Eureka002Application.class, args);
}
}
在服务主程序中加上:EnableEurekaServer
创建服务:
启动后:
Cannot execute request on any known server
说明当前没有服务注册
打开控制台:
http://localhost:8080/
设置后可以注册自忆
eureka:
client:
service-url:
defaultZone: http://localhost:8080/eureka #注册服务地址
register-with-eureka: false #不注册服务自已
spring:
application:
name: eureka #服务名称
服务端写好可以打包JAR文件方法如下:
【说明】
- compile是编译出classes文件
- package是打包发布
- 运行:java –jar xxxxxx.jar
6.客户端
@SpringBootApplication
@EnableDiscoveryClient
public class EurekaclientApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaclientApplication.class, args);
}
}
首无要配制EnableDiscoveryClient然后注册到哪个注册中心
eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka #注册服务地址
spring:
application:
name: eureka-client #服务名称
server:
port: 8081
配制完客户端即可启动但是会遇到一个问题:
Invocation of destroy method failed on bean with name 'scopedTarget.eurekaClient': org.springframework.beans.factory.BeanCreationNotAllowedException: Error creating bean with name 'eurekaInstanceConfigBean': Singleton bean creation not allowed while singletons of this factory are in destruction (Do not request a bean from a BeanFactory in a destroy method implementation!)
怎么解决呢:
这是因为client里不包含Tomcat的依赖,所以Spring容器无法创建一些实例,从而导致项目无法启动,只需在pom.xml文件中,加上web依赖即可:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
项目启动成功后,可以在eureka server的信息面板中查看到已注册的实例信息
又出现另外一个问题:
EMERGENCY! EUREKA MAY BE INCORRECTLY CLAIMING INSTANCES ARE UP WHEN THEY'RE NOT. RENEWALS ARE LESSER THAN THRESHOLD AND HENCE THE INSTANCES ARE NOT BEING EXPIRED JUST TO BE SAFE.
意就是客户端上线率太低造成,怎么解决呢
在服务端加入:
server:
enable-self-preservation: false #开发时不统计上线率
这时又会出现:
THE SELF PRESERVATION MODE IS TURNED OFF.THIS MAY NOT PROTECT INSTANCE EXPIRY IN CASE OF NETWORK/OTHER PROBLEMS.
这个没关系就是说在生产环境中不可以关闭这个,只能在生产环境中关闭
7.高可用性
实现互相注册
下面开始模拟:
先复制一个服务端:
分别命名01,02
选启动第一台,注册到第二台上:8762
启动
然后选择第二个注册到第一个上需要修改yml配制文件的端口
同样方法:
此时启动客户端:
先注册到任一台上测试,见证奇迹的时刻到了:
客户端启是注册到第一台上的:
第二台同时也出现了:
这时虽然注册了一个但是服务端会自动同步到第二台上所以第二台可以看到
这个虽然可以同步,但是会有问题就是第一台挂了,虽然第二台可以用,但是如果重启了第二台,就无法注册到第二台了。怎么做呢?
方法:
每次客户端向二台服务器中同时注册就可以了。
eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka,http://localhost:8762/eureka #注册服务地址