SpringCloud
一、微服务说明
1、微服务
单体项目进行功能强耦合的拆分之后(纵向拆分),形成独立运行的各个系统就叫做微服务。
2、微服务框架
管理拆分之后的大量微服务集群节点的框架技术
3、常见框架springcloud & dubbo
共同点:都是轻量级的微服务框架
dubbo支持使用不同的微服务治理组件eureka、redis和zookeeper(rpc协议)(2017之前几年不更新,微服务框架组件没有springcloud多)
springcloud的微服务只能使用http协议,dubbo支持rpc协议(dubbo性能高一些)
4、CAP理论
CONSISTENCY一致性 AVALIBILITY可用性 PARTITION TOLERENCE分区容忍度(高低之分)
CAP理论是分布式基础理论.CAP不能同时存在
CA:没有分区,网络通畅,数据通畅,一致性和可用性都可以实现
CP:分区出现时,要求数据一致性,可用性降低
AP:分区出现时,要求可用性,导致一致性降低
5、eureka和zookeeper选哪个
eureka:http协议,传输速度没有rpc快,系统如果使用eureka,技术选型偏向于AP理论(不要求数据一致性特别高)
zookeeper:rpc协议,系统如果使用zookeeper,要求偏向于CP理论(数据一致性强)
二、springcloud使用
一、介绍
eureka:微服务框架的核心,微服务治理组件,管理所有微服务的信息(节点,服务名称,端口,运行地址) ;
ribbon:微服务中实现服务调用服务的客户端组件;
zuul:网关组件;
config:配置中心;
feign:声明式的调用客户端(和ribbon是样的,注解+代理实现的服务调用服务) ;
hystrix:熔断逻辑(解决服务间调用的错误组件,降级逻辑)。
二、搭建eureka注册中心
1、pom文件中加入
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.9.RELEASE</version>
</parent>
#引入cloud依赖
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Edgware.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
#引入注册中心需要的依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka-server</artifactId>
</dependency>
2、配置application.properties
server.port=8761
eureka.instance.hostname=localhost
eureka.client.registerWithEureka=true
eureka.client.fetchRegistry=true
eureka.client.serviceUrl.defaultZone=http://localhost:8762/eureka
eureka.server.enable-self-preservation=false
eureka.instance.preferIpAddress=true
3、配置启动类
@SpringBootApplication
@EnableEurekaServert
public class StarterEurekaServert01 {
public static void main(String[] args) {
SpringApplication.run(StarterEurekaServert01.class, args);
}
}
4、访问内嵌管理页面 http://localhost:8761/ 即可看到节点信息
三、注册中心高可用
复制上面那个工程,修改配置文件、启动类名称即可
#8761的注册中心配置文件
server.port=8761
spring.application.name=server
eureka.instance.hostname=localhost
eureka.client.registerWithEureka=true
eureka.client.fetchRegistry=true
eureka.client.serviceUrl.defaultZone=http://localhost:8762/eureka
eureka.server.enable-self-preservation=false
eureka.instance.preferIpAddress=true
#8762的注册中心配置文件(工程拷贝8762修改配置文件,启动类名称)
server.port=8762
spring.application.name=server
eureka.instance.hostname=localhost
eureka.client.registerWithEureka=true
eureka.client.fetchRegistry=true
eureka.client.serviceUrl.defaultZone=http://localhost:8761/eureka
eureka.server.enable-self-preservation=false
eureka.instance.preferIpAddress=true
四、创建服务端
1、pom文件
就是依赖的artifactId那里改一下:spring-cloud-starter-eureka
2、配置application.properties
server.port=9001
spring.application.name=helloservice
eureka.client.serviceUrl.defaultZone=http://localhost:8761/eureka
3、配置启动类
@SpringBootApplication
@EnableEurekaClient
public class StarterEurekaClient01 {
public static void main(String[] args) {
SpringApplication.run(StarterEurekaClient01.class, args);
}
}
五、创建ribbon客户端
1、pom文件
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.9.RELEASE</version>
<relativePath /> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!--Eureka相关依赖 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
<!--Ribbon相关依赖 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-ribbon</artifactId>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<!--注意这个位置,必须是springboot支持的版本。否则会报出依赖会有错误,但是编译没有问题 运行出 java.net.UnknownHostException: 的错 -->
<version>Edgware.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
2、application.properties文件
server.port=9004
spring.application.name=service-ribbon
eureka.client.serviceUrl.defaultZone=http://localhost:8761/eureka,http://localhost:8762/eureka
3、启动类
@SpringBootApplication
@EnableEurekaClient
public class StarterRibbon {
public static void main(String[] args) {
SpringApplication.run(StarterRibbon.class, args);
}
//restTemplate支持http协议,不能支持服务的调用
//引入ribbon的拦截注解,默认拦截的负载均衡逻辑是轮询
@Bean
@LoadBalanced
public RestTemplate initRestTemplate(){
return new RestTemplate();
}
//自定义负载均衡规则
@Bean
public IRule initRandomRule(){
return new RandomRule();
}
}
4、使用的地方
@Service
public class HelloService {
//在ribbon的访问过程中,使用代码restTemplate
//访问helloservice的服务
@Autowired
private RestTemplate client;
public String sayHi(String name) {
//使用上面注入的restTemplate发起服务调用
//默认是轮询的情况
//第一个参数位置是网址,第二个返回的参数
String msg = client.getForObject("http://helloservice/hi?name="+name,String.class);
return msg;
}
}
六、zuul网关组件
springcloud提供了唯一对外访问的入口组件–zuul网关.可以实现访问url地址的路由/过滤等功能。
1、pom文件
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.9.RELEASE</version>
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zuul</artifactId>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Edgware.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
2、application.properties文件
server.port=8103
spring.application.name=zuul-service
eureka.client.serviceUrl.defaultZone=http://localhost:8761/eureka
<-- 下面是 -->
zuul.routes.api-a.path=/api-a/**
zuul.routes.api-a.serviceId=service-ribbon
zuul.routes.api-b.path=/api-b/**
zuul.routes.api-b.serviceId=helloservice
zuul.routes.product.path=/zuul-product/**
zuul.routes.product.serviceId=productservice
zuul.routes.pic.path=/zuul-pic/**
zuul.routes.pic.serviceId=imgservice
location /cart {
proxy_pass http://127.0.0.1:8103/zuul-cart/cart/manage;
add_header 'Access-Control-Allow-Credentials' 'true';
add_header 'Access-Control-Allow-Origin' '*';
}
3、配置启动类
@SpringBootApplication
@EnableZuulProxy
public class StarterZuulGateWay {
public static void main(String[] args) {
SpringApplication.run(StarterZuulGateWay.class, args);
}
}
4、流转逻辑
①页面输入 http://localhost:8103/api-b/hello?name=liulaoshi
②先因为输入的是8103,所以到了zuul网关这里,配置文件中能找到api-b路径。
③将前面去掉,重新匹配的结果是http://helloservice/hello?name=liulaoshi
④在注册中心里有helloservice的服务,所以转到那个服务处http://localhost:9004/hello?name=liulaoshi
七、Nginx和zuul实现高可用
1、首先有两个zuul网关服务,端口分别为(8104和8105)
2、然后nginx中指向一下
upstream zuulcluster{
server 127.0.0.1:8103;
server 127.0.0.1:8104;
}
server {
listen 80;
server_name www.ssm.com;
location /zuul{
proxy_pass http://zuulcluster;
}
}
3、流转过程