1.SpringCloud概述
SpringCloud就是一些组件的集合,然后都用了spring boot的技术(相当于秦始皇统一度量衡),下面呢也就是介绍一下这些组件的用法,注意事项等。
2.服务治理(服务的注册、发现)
为什么要注册中心,看代码
@RestController
@RequestMapping("/findCon")
public class ConsumerCtl {
@Autowired
RestTemplate restTemplate;
@GetMapping("/find/{id}")
private CompanyInfo find(@PathVariable int id){
//这边就是传统意义上调用其他方法的逻辑,这边还没有用到注册中心,如果改了就非常
//耦合了,那有的人说放配置文件里面,其实也可以,只不过是从改代码和
// 改配置文件的区别
CompanyInfo ci = restTemplate.getForObject("http://localhost:8888/company/findCompany/1", CompanyInfo.class);
return ci;
}
}
2.1 Eureka 基本使用
2.1.1 EurekaServer
启动类配置
@SpringBootApplication
//Eureka 服务端
@EnableEurekaServer
public class EurekaApp {
public static void main(String[] args) {
SpringApplication.run(EurekaApp.class,args);
}
}
配置文件
server:
port: 8761
eureka:
instance:
hostname: localhost #主机名字
client:
service-url:
defaultZone: http://${eureka.instance.hostname}}:${server.port}/eureka
#注册地址
register-with-eureka: false #注册到eureka上,但是我现在这个是server不需要注册
fetch-registry: false #是否需要从eureka上拿路径
2.1.2 Eureka Client
把其他服务注册到eureka上
//客户端注册,这个注解可写可不写
@EnableEurekaClient
@SpringBootApplication
public class EurekaProvider {
public static void main(String[] args) {
SpringApplication.run(EurekaProvider.class,args);
}
}
配置文件
eureka:
instance:
hostname: localhost #主机名字
client:
service-url:
defaultZone: http://localhost:8761/eureka
#注册地址 注册到eureka
register-with-eureka: true
#注册到eureka上,但是我现在这个是server不需要注册,默认也是true
fetch-registry: true #是否需要从eureka上拿路径,默认也是true可以不用写
spring:
application:
name: eureka-client
#注册到eureka上的app名字
pom文件
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
最后的结果就是这样
2.1.3 从eureka中获取ip和端口
import org.springframework.cloud.client.discovery.DiscoveryClient;
@Autowired
DiscoveryClient discoveryClient;
private CompanyInfo find(@PathVariable int id){
//下面可以从eureka上获取服务的地址
List<ServiceInstance> instances = discoveryClient.getInstances("EUREKA-CLIENT");
String url = "http://"+instances.get(0).getHost()+":"+instances.get(0).getPort()+"/company/findCompany/1";
CompanyInfo ci = restTemplate.getForObject(url,
CompanyInfo.class);
return ci;
}
2.1.4 eureka-instance 其他的配置
这边还是配置文件里关于eureka-instance下的其他的配置。这部分可以了解一下不是很重要。
eureka:
instance:
hostname: localhost #主机名字
prefer-ip-address: true #ip地址不以localhost显示
ip-address: 127.0.0.1 # 显示的IP地址
#这边实例的地址
instance-id: ${eureka.instance.ip-address}:${spring.application.name}:${server.port}
lease-expiration-duration-in-seconds: 9 #如果9秒之内没有收到心跳,服务器就把我剔除
lease-renewal-interval-in-seconds: 3 #间隔多长时间给eureka服务端发送一次心跳证明自己还活着
2.1.5 eureka-server 配置
eureka:
server: #这边主要的功能是注册的服务如果没有收到心跳不会立马给你剔除,会保留一段时间
enable-self-preservation: false #这个生产环境一般是开启的,测试环境不开启
eviction-interval-timer-in-ms: 3000 #清理没有用的服务间隔
2.1.6 eureka集群
主要是看他们相互调用的关系,我就理解为启动多个eurekaServer。然后把服务注册到这些Server上
server:
port: 8763
eureka:
instance:
hostname: zxEureka1 #主机名字
client:
service-url:
defaultZone: http://zxEureka2:8762/eureka #这边指向的是集群的服务器
#注册地址
register-with-eureka: false #注册到eureka上,但是我现在这个是server不需要注册
fetch-registry: false #是否需要从eureka上拿路径
spring:
application:
name: eurekaTeam
#上面是第一台eurekaserver 的配置
#下面是第二台eurekaserver 的配置
server:
port: 8762
eureka:
instance:
hostname: zxEureka2 #主机名字
client:
service-url:
defaultZone: http://zxEureka1:8763/eureka #这边指向的是集群的服务器
#注册地址
register-with-eureka: false #注册到eureka上,但是我现在这个是server不需要注册
fetch-registry: false #是否需要从eureka上拿路径
spring:
application:
name: eurekaTeam #集群的server应用名称要一样
#注册方和调用方
server:
port: 8889
eureka:
instance:
hostname: localhost #主机名字
client:
service-url:
defaultZone: http://zxEureka2:8762/eureka,http://zxEureka1:8763/eureka
#注册地址 注册到eureka
register-with-eureka: true #注册到eureka上,但是我现在这个是server不需要注册
fetch-registry: true #是否需要从eureka上拿路径
spring:
application:
name: eureka-consumer
2.2 Consul 的安装
如果有同学安装出现问题可以看这个帖子,一般用云服务器才会出现这样的问题
consul启动报错listen tcp 39.108.107.163:8600: bind: cannot assign requested address_Qfoom的博客-CSDN博客
2.2.1 consul 配置
这边注意的是消费方去拿注册到consul服务地址还是那个方法
只是取的名字不太对
import org.springframework.cloud.client.discovery.DiscoveryClient;
@Autowired
DiscoveryClient discoveryClient;
List<ServiceInstance> instances = discoveryClient.getInstances("EUREKA-CLIENT");
server:
port: 8000
spring:
cloud:
consul:
host: localhost #你自己的consul服务器的地址
port: 8500
discovery:
service-name: ${spring.application.name}
prefer-ip-address: true #是不是用ip
application:
name: Consul
2.2.2 consul pom配置
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-consul-discovery</artifactId>
</dependency>
2.3 Nacos
国产之光,阿里系,注册中心和配置中心,开源!
pom文件
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<version>0.2.2.RELEASE</version>
</dependency>
配置文件
server:
port: 8888
spring:
cloud:
nacos:
discovery:
server-addr: localhost:8848 #nacos 地址
application:
name: Nacos-consumer
获取方式还是统一的,没什么变化。
3.Ribbon 负载均衡
ribbon是客户端的负载均衡,首先讲一下有7种负载均衡的策略。
ribbon有两个功能第一就是简化获取服务的作用,之前我们是获取ip 获取端口然后拼接url实现,
用ribbon 就会简便很多,虽然这么配置只是简化了调用,但是也给消费端配置了一个轮询的策略。
//配置类
@Configuration
public class RestTemplateConfig {
//定义bean
@Bean
//使用ribbon
// 加了这个注解之后通过ip和端口访问的方式就会失效
@LoadBalanced
public RestTemplate getRestTemplate(){
return new RestTemplate();
}
}
@GetMapping("/find2/{id}")
private CompanyInfo find2(@PathVariable int id){
String url = "http://EUREKA-CLIENT/company/findCompany/1";
CompanyInfo ci = restTemplate.getForObject(url,
CompanyInfo.class);
return ci;
}
如果我们要换轮询策略的话有两种方式可以换
第一种配置文件的方式
#这个是服务端的服务名称
EUREKA-CLIENT:
ribbon:
NFloadBalancerRulerClassName: com.netflix.loadbalancer.RandomRule
#这边是具体的策略,一共有7种。
第二种是代码方式
首先需要一个配置类
@Configuration
public class MyRule {
@Bean
public IRule rule(){
return new RandomRule();
}
}
#上面下面是两个类,注意区分
//允许去eureka上去获取地址
@EnableDiscoveryClient
//注册到eureka的服务
@EnableEurekaClient
@SpringBootApplication
//name 设置服务提供方服务名称
@RibbonClient(name = "EUREKA-CLIENT",configuration = MyRule.class)
public class ConsumerApp {
public static void main(String[] args) {
SpringApplication.run(ConsumerApp.class,args);
}
}