Springcloud分布式框架
一、SpringCloud概述
SpringCloud也是基于RPC远程调用的,是在SOA架构基础上演变而来,相对于SOA架构来说更加请假,而且开发要求不是特别严格,基于HTTP+REST+JSON进行数据的传输
SpringCloud基于SpringBoot,提供很多组件,有Eureka,Ribbon,Fegion,zuul,config等
二、Eureka注册中心
SpringCloud当中自带注册中心,该角色就是Eureka,主要用于服务发现和调用,分为两个角色:
EurekaServer:服务端 @EnableEurekaServer
管理服务,对外暴露地址
EurekaClient:客户端 @EnableEurekaClient
连接到服务端,例如生产者连接到服务端,向上注册服务。 消费者连接到服务端,往下取服务
1、注册中心环境搭建
步骤一:导入依赖
父工程中导入SpringBoot依赖
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.4.RELEASE</version>
</parent>
子工程:
<dependencies>
<!--eureka依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<!--springCloud依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Greenwich.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
2、步骤二:创建配置文件,配置eureka
#声明端口
server:
port: 8001
#配置eureka
eureka:
client:
#是否把自己注册到注册中心当中去,默认值为true
register-with-eureka: false
#表示是否从Eureka Server获取注册信息,默认为true
fetch-registry: false
#配置注册中心地址
service-url:
defaultZone: http://localhost:8001/eureka
#应用名称,应用名不能有_
spring:
application:
name: eureka-server
3、步骤三:创建启动类
@SpringBootApplication
@EnableEurekaServer //代表是Eureka服务器
public class StartEurekaServer {
public static void main(String[] args) {
SpringApplication.run(StartEurekaServer.class,args);
}
}
4、Eureka生产者
步骤一:创建一个业务接口
/**
* 业务接口
*/
public interface DoSomeService {
/**
* 业务方法
* @return
*/
public String doSome();
}
步骤二:创建一个业务接口的实现类,利用HTTP方式将次接口暴露出去
/**
* 业务接口的实现类
*/
@RestController
public class DoSomeServiceImpl implements DoSomeService {
@RequestMapping("/doSome")
@Override
public String doSome() {
System.out.println("DoSomeService 业务接口的doSome方法");
return "Eureka Provider";
}
}
步骤三:创建配置文件,指定端口,应用名称,Eureka注册中心
#端口号
server:
port: 9001
#应用名称
spring:
application:
name: eureka-provider
#配置EurekaServer注册中心地址
eureka:
client:
service-url:
defaultZone: http://localhost:8001/eureka
5、Eureka消费者
步骤一:创建一个控制器,用于通过HTTP请求到服务提供者
@RestController
@RequestMapping("/doSomeCon")
public class DoSomeController {
@Resource
private RestTemplate restTemplate;
@RequestMapping("/doSome")
public String doSome(){
System.out.println("服务消费者,控制方法");
String returnValue = restTemplate.getForObject("http://localhost:9001/doSome", String.class);
return returnValue;
}
}
步骤二:创建一个启动类,要将RestTemplate模板注入到容器当中
@SpringBootApplication
@EnableEurekaClient
public class StartConsumer {
public static void main(String[] args) {
SpringApplication.run(StartConsumer.class,args);
}
//注入RestTemplate模板
@Bean
RestTemplate restTemplate(){
return new RestTemplate();
}
}
步骤三:创建配置文件,指定端口,应用名称,Eureka注册中心
#端口号
server:
port: 10001
#应用名称
spring:
application:
name: eureka-consumer
#注册中心
eureka:
client:
service-url:
defaultZone: http://localhost:8001/eureka
三、Ribbon负载均衡
1、搭建生产者服务集群
条件:端口号不同,应用名称要相同,数据同步
问题:消费者调用怎么办?
消费者不能根据端口号调用,通过应用名字调用
@RequestMapping("/doSome")
public String doSome(){
System.out.println("服务消费者,控制方法");
String returnValue = restTemplate.getForObject("http://eureka-provider/doSome", String.class);
return returnValue;
}
附带问题:restTemplate不知道要使用应用名字调用,默认使用的是IP+端口,解决办法:在注入RestTemplate模板时加入@LoadBalanced注解
//注入RestTemplate模板
@Bean
@LoadBalanced //负载均衡配置,可以使用应用名称调用服务
RestTemplate restTemplate(){
return new RestTemplate();
}
2、调用的机制(负载均衡机制)
在RestTemplate模板上加入@LoadBalanced注解,即可实现Ribbon负载均衡,默认机制为轮训机制
调整机制:
自定义算法,也可以使用随机访问
//重新创建一个均衡策略,表示不使用默认
@Bean
public IRule getIReule(){ //通过获取一个IRule对象,
return new RandomRule(); //达到的目的,用我们重新选择的随机,替代默认的轮训方式
}
来源:https://www.cnblogs.com/fxdmzygr/p/12658352.html