SpringCloud五大组件
1.erueka(服务注册与发现)
2.ribbon(负载均衡)
3.Hystrix(短路器)
4.zuul(路由网关)
5.springcloudconfig(分布式配置中心)
准备工作:创建一个maven父工程
new project->maven
选好jdk,我是1.8,下一步
填好名称创建
创建完毕后,在父工程添加后面子工程要用到的依赖:
这里要注意springboot的版本和springcloud版本的对应,不然会冲突。springcloud官网有版本对应关系
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.2.13.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
1.erueka的搭建和erueka注册中心的集群
erueka分为服务端和客户端,服务端也就是我们说的服务注册中心。
先来搭建服务端:
点击父工程,new module。新建maven子工程
然后pom文件添加依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
然后为服务添加主启动类和配置文件
主启动类上加上注解:@EnableEurekaServer
配置文件配置服务的端口号和erueka相关设置
需要注意:我的本地host文件有peer1到127.0.0.1的映射,如果没有配置的话,那么可以写localhost
server:
port: 8761
eureka:
instance:
hostname: peer1 #eureka服务端的实例名称
client:
register-with-eureka: false #false表示不向注册中心注册自己。
fetch-registry: false #false表示自己端就是注册中心
service-url:
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/ #设置与Eureka Server交互的地址查询服务和注册服务都需要依赖这个地址。
然后启动服务,访问设置的端口号
http://localhost:8761/ 页面如下图,设置成功。
好的,接下来我们搭建erueka的客服端,将客户端注册进上面配置的配置中心。
父工程下新建子工程
在pom文件导入依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
同样,为该服务创建配置文件和主启动类:
主启动类上加上注解@EnableEurekaClient
配置文件主要配置如下:
server:
port: 8001
eureka:
client:
serviceUrl:
defaultZone: http://peer1:8761/eureka/
instance:
lease-renewal-interval-in-seconds: 1
lease-expiration-duration-in-seconds: 2
spring:
application:
name: provider-demo
开始测试,启动erueka服务端,在启动当前客户端
访问erueka界面
出现下图,则我们刚创建的erueka客户端注册进注册中心了。
然后我们再做一下erueka的集群
我们需要新建两个子工程,和之前的erueka服务端一样,pom导入相同的依赖。
编写主启动类加上@EnableEurekaServer注解,编写配置文件。然后我们把三个erueka服务端的配置文件稍作修改:让它们的端口号不同,服务端实例名称不同,由于我们的集群测试是自己一台电脑模拟三台电脑进行集群,所以这里要实例名称不一样,然后再我们的本地host文件对实例的名称进行ip映射,映射到自己的电脑
最后把~defaultZone:服务地址改一下 。
server:
port: 8761
eureka:
instance:
hostname: peer1 #eureka服务端的实例名称
client:
register-with-eureka: false #false表示不向注册中心注册自己。
fetch-registry: false #false表示自己端就是注册中心
service-url:
# defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/ #设置与Eureka Server交互的地址查询服务和注册服务都需要依赖这个地址。
defaultZone: http://peer1:8761/eureka,http://peer2:8762/eureka,http://peer3:8763/eureka
server:
port: 8762
eureka:
instance:
hostname: peer2 #eureka服务端的实例名称
client:
register-with-eureka: false #false表示不向注册中心注册自己。
fetch-registry: false #false表示自己端就是注册中心
service-url:
# defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/ #设置与Eureka Server交互的地址查询服务和注册服务都需要依赖这个地址。
defaultZone: http://peer1:8761/eureka,http://peer2:8762/eureka,http://peer3:8763/eureka
server:
port: 8763
eureka:
instance:
hostname: peer3 #eureka服务端的实例名称
client:
register-with-eureka: false #false表示不向注册中心注册自己。
fetch-registry: false #false表示自己端就是注册中心
service-url:
# defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/ #设置与Eureka Server交互的地址查询服务和注册服务都需要依赖这个地址。
defaultZone: http://peer1:8761/eureka,http://peer2:8762/eureka,http://peer3:8763/eureka
然后我们把三个注册中心都启动起来,这个时候肯定要报错,因为三个服务启动总有先后顺序,所以它会因为找不到集群的其他服务而报错,没有关系的。
访问http://localhost:8761/,当然也可以访问8762或者8763查看。出现下图,也就设置集群成功了。
2.ribbon负载均衡
为了测试负载均衡,我们先按照上面springcloud-provider服务,再创建两个模拟的服务提供者。pom文件和启动类上注解都一样。
我们只需要在配置文件中修改端口号,把8000改成8001,8002。其中特别需要注意的是,三个的spring-applicaton-name属性要全部相同。这样才是负载均衡。
然后,我们访问erueka,看看provider-demo程序是否对应三个服务端口,如下:
然后,我们我们为了测试负载均衡的时候看到我们调用的那个端口的服务,我们再三个provider服务添加controller层,添加请求接口,输出不同的内容,如下:
接下来,我们就创建一个调用三面上个provider提供的接口服务的消费者模块。
pom文件导入依赖:
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>
</dependencies>
创建主启动类并添加注解
@RibbonClient(name=“provider-demo”,configuration= MyselfRule.class)
@EnableEurekaClient
@SpringBootApplication
这里的@RibbonClient(name=“provider-demo”,configuration= MyselfRule.class)可以不加,加上就是我们需要自定义负载均衡策略,name是要负载均衡的服务名称,configuration是我们自定义的负载均衡规则类,不建议放在启动类同级目录或子层目录,因为那样我们的策略就对所有的ribbon生效了,达不到定制化了
如下图:我们要实现自定义负载均衡的话,我们定义类继承AbstractLoadBalancerRule,然后在MyselfRule中注入IRule的时候返回,我这里返回的是ribbon默认的轮询策略。
然后我们在consumer模块利用restTemplate,调用provider提供的服务。
要实现负载均衡,就要在restTemplate注入时加上@LoadBalanced
@RestController
public class ConsumerController {
@LoadBalanced
@Bean
public RestTemplate restTemplate(){
return new RestTemplate();
}
@Autowired
private RestTemplate restTemplate;
@RequestMapping("consumer/demo")
public String ContumerDemo(){
return this.restTemplate.getForObject("http://provider-demo/provider/demo",String.class);
}
}
然后,我们可以测试了,我上面在MyselfRule返回的是ribbon的轮询策略,
我们在游览器多次请求 http://localhost:7001/consumer/demo
显示的顺序是
也就是provider的实例每个调用一次,就是轮询。
你也可以试试在MyselfRule中return new RandomRule()。也就是随机策略,看看多次请求得到的顺序是否是随机的。
额,有点累了,剩下的springcloud笔记下次再整理。。。