实现服务之间的调用可以使用restTemplate()函数实现服务之间的调用,但是存在硬编码问题,并且调用者需要有被调用者的实体
格式:SomeClass someClass=restTemplate("someurl",SomeClass.class);
eureka实现服务的治理:
是一个服务的注册中心,自己也是一个独立的服务,对外暴露自己的地址
提供者:启动后向eureka注册自己的地址,以及自己提供的服务
消费者:向eureka订阅服务,eureka会将对应服务的所有地址列表发送给消费者,并且定期更新。
最后通过提供的地址列表访问对应的服务(不是消费者和提供者之间的直接通信)
eureka的基本原理图
基本使用
@SpringBootApplication @EnableEurekaServer public class LyRegistry { public static void main(String[] args) { SpringApplication.run(LyRegistry.class); } }
eureka的server端配置信息
官方默认的端口是8761,因为eureka自己也是一个服务,所以eureka需要自己向自己注册
server: port: 10086 //微服务的端口
spring:
application:
name: eureka-server eureka: client: service-url: defaultZone: http://127.0.0.1:10086/eureka //注册的地址
registry-with-eureka: false //设置自己不注册自己
instance:
prefer-ip-address: true
ip-address: 127.0.0.1 //将IP地址写死,下次启动加快,因为他会去找相应的IP
lease-renewal-interval-in-seconds: 30 //心跳间隔
lease-expiration-duration-in-seconds: 90 服务挂掉的时间
源码中service-url是个map,所以defaultZone的配置方式就是map的配置方式。
这里需要自己注册自己的原因是,默认的eureka服务的端口是8761,这这里我们将服务的端口号改成10086,所以eureka的默认注册地址失效,所以现在自己手动配置。
eureka的client使用
@SpringBootApplication @EnableDiscoveryClient public class LyRegistry { public static void main(String[] args) { SpringApplication.run(LyRegistry.class); } }
这个注解可以发现多种注册服务不仅仅是eureka的,官方推荐
同一个服务的不同应用叫作实例(多个Tomcat)
可以使用discoverClient获得服务的实例列表,返回list列表,通过实例可以获得IP和地址,接着使用上面的restTemplate()获得相应实例中的相应的服务。但是这种每次都是访问一个服务,实现不了负载均衡。
eureka高可用
eureka服务之间的相互配置
如果启动多个eureka集群,实现方式就是eureka服务之间相互注册,注册的时候,注册地址的端口号不在是自己的端口号,是别的eureka服务的注册,注册地址写多个eureka服务器的地址
同理,服务的都要向eureka服务器注册,即注册的地址写上多个。
server: port: 10086 spring: application: name: eureka-server eureka: client: service-url: http://localhost:10087/eureka,http://localhost:10088/eureka fetch-registry: true registry-fetch-interval-seconds: 30 instance: prefer-ip-address: true ip-address: localhost lease-renewal-interval-in-seconds: 30 lease-expiration-duration-in-seconds: 90
服务端
server:
port: 10086
spring:
application:
name: user-service #服务的名字
eureka:
client:
service-url:
defaultZone: http://localhost:10086/eureka #注册的eureka服务地址
registry-fetch-interval-seconds: 30 #默认拉取服务列表的时间间隔
instance:
prefer-ip-address: true
ip-address: localhost
lease-renewal-interval-in-seconds: 30 #心跳周期
lease-expiration-duration-in-seconds: 90 #挂掉的时间
user-service:
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule #设置负载均衡的算法
服务中的心跳默认是30秒的。默认90秒收不到心跳就表示服务挂了eureka服务列表的拉取周期默认也是30秒,是打开的,也可以关闭
server端
server: port: 10086 spring: application: name: eureka-server eureka: client: service-url: http://localhost:10087/eureka,http://localhost:10088/eureka fetch-registry: true #不向自己注册 server: eviction-interval-timer-in-ms: 600000 #定时清除时间 enable-self-preservation: true #自我保护,默认打开 instance: prefer-ip-address: true ip-address: localhost
失效剔除和自我保护
负载均衡Ribbon,
微服务导入Ribbon
负载均衡的算法:随机、轮询、hash(相当于给每个用户分配相同的服务器)、最小访问
使用:1、找到启动类,找到RestTemplate对象的定义的地方直接在@bean注解上加上@LoadBalanced注解
@EnableEurekaServer @SpringBootApplication public class starter { @Bean @LoadBalanced public RestTemplate restTemplate(){ return new RestTemplate(); } public static void main(String[] args) { SpringApplication.run(starter.class); } }
2、使用
String url="http://user-service/user/"+id; //这里的id是请求路径后面的参数 User user= restTemplate.getForObject(url,User.class);
Ribbon内置拦截器,拦截所有的restTemplate请求,在请求中设置一些内容