SpringCloud分布式框架

那年仲夏 提交于 2020-04-08 10:53:39

Springcloud分布式框架

 

SpringCloud概述

SpringCloud也是基于RPC远程调用的,是在SOA架构基础上演变而来,相对于SOA架构来说更加请假,而且开发要求不是特别严格,基于HTTP+REST+JSON进行数据的传输

SpringCloud基于SpringBoot,提供很多组件,有EurekaRibbonFegionzuulconfig

 

二、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);

}

}

4Eureka生产者

步骤一:创建一个业务接口

/**

 * 业务接口

 */

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

 

 

 

5Eureka消费者

步骤一:创建一个控制器,用于通过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();  //达到的目的,用我们重新选择的随机,替代默认的轮训方式

}

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!