欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

SpringCloud

程序员文章站 2022-06-13 10:31:03
...

一、微服务说明

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、流转过程
SpringCloud