搭之前先说说都需要什么,首先既然是微服务,那么肯定要有一个注册中心,统一管理各个服务,这就是Eureka,然后这个注册中心上还需要有服务的提供者,也就是service,有了注册中心和服务提供者还需要有个服务消费者,也就是调用服务的client端,有了这3者,我们就能搭建最简单的Spring Cloud架构了。
先来个注册中心,如果你是用的IDEA那么搭建Eureka那是相当简单
然后下一步设置名称啥的,我就不截图了。
再下一步
看见了吗?人家IDEA都给咱准备好了,直接就有Eureka,当然左边那列里还有很多常用的组件,没事都可以看看
接着下一步,完成,然后在resources里新建一个文件application.yml,文件里配置一下端口和名称
server:
port: 8761
eureka:
instance:
hostname: localhost
#服务过期时间配置,超过这个时间没有接收到心跳EurekaServer就会将这个实例剔除
#注意,EurekaServer一定要设置eureka.server.eviction-interval-timer-in-ms否则这个配置无效,这个配置一般为服务刷新时间配置的三倍
#默认90s
lease-expiration-duration-in-seconds: 15
#服务刷新时间配置,每隔这个时间会主动心跳一次
#默认30s
lease-renewal-interval-in-seconds: 5
preferIpAddress: true
server:
#关闭自我保护
enable-self-preservation: false
#启用主动失效,并且每次主动失效检测间隔为3s
#默认60s
eviction-interval-timer-in-ms: 3000
#eureka server缓存readWriteCacheMap失效时间,这个只有在这个时间过去后缓存才会失效,失效前不会更新,过期后从registry重新读取注册服务信息,registry是一个ConcurrentHashMap。
#由于启用了evict其实就用不太上改这个配置了
#默认180s
responseCacheAutoExpirationInSeconds: 180
#eureka server刷新readCacheMap的时间,注意,client读取的是readCacheMap,这个时间决定了多久会把readWriteCacheMap的缓存更新到readCacheMap上
#默认30s
responseCacheUpdateInvervalMs: 3000
client:
#eureka client刷新本地缓存时间
#默认30s
registryFetchIntervalSeconds: 5
registerWithEureka: false
fetchRegistry: false
serviceUrl:
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
ribbon:
#eureka客户端ribbon刷新时间
#默认30s
ServerListRefreshInterval: 1000
spring:
application:
name: eurka-server
这个设置有些复杂,因为Erueka有一些坑,服务提供者如果掉线了Erueka不知道,需要等待一段时间才知道,所以这里配置的比较多,如果搭demo的话,其实只需要保留server和spring就可以了
接下来给启动文件添加个注解@EnableEurekaServer
OK,搞定,启动项目,浏览器输入http://localhost:8761/
这样一个Erueka注册中心就搭建好了,是不是超级简单?用eclipe开发的朋友可以去我的源码里复制pom文件一样也很简单
下面再来个服务端,跟上面一样,同样是新建一个maven子项目,名字就叫serviceorder,订单服务,刚才的pom用的是Erueka的server,这次用client
<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-server</artifactId>
</dependency>
</dependencies>
这是pom文件,我用的server也没报错,不知道为啥,另外又加了一个web,因为需要用到@controller注解
然后是yml配置文件
server:
port: 8762 #8762 8763
spring:
application:
name: serviceorder
eureka:
instance:
#服务过期时间配置,超过这个时间没有接收到心跳EurekaServer就会将这个实例剔除
#注意,EurekaServer一定要设置eureka.server.eviction-interval-timer-in-ms否则这个配置无效,这个配置一般为服务刷新时间配置的三倍
#默认90s
lease-expiration-duration-in-seconds: 15
#服务刷新时间配置,每隔这个时间会主动心跳一次
#默认30s
lease-renewal-interval-in-seconds: 5
preferIpAddress: true
client:
#eureka client刷新本地缓存时间
#默认30s
registryFetchIntervalSeconds: 5
serviceUrl:
defaultZone: http://localhost:8761/eureka/
一样需要配置端口,名称,另外需要配置Eureka注册中心的地址。
然后新建几个包,模拟一下正常的项目,我随便建了几个,controller,service等
注意一下这个注解,原来用是@controller,不知道为啥总是报错,后来改成@restcontroller就好了。。。。
接着启动项目,就能看到这个服务了
看到服务后证明服务没有问题,然后再试一下刚才的接口能不能用,浏览器输入http://localhost:8762/order/find
没问题,证明这个服务是好的,接下来就要调用服务了
其实调用服务如果前端框架玩的溜的话,也可以使前端框架调用,但本人前端不灵,就用还用spring实现了,跟刚才一样,继续创建一个新的maven子项目,不过这次要多引一些jar包了,需要feign,其实也可以使用ribbon,不过feign整合了ribbon的负载均衡,也整合了Hystrix的熔断,所以我们使用feign,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-server</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>/scope>
</dependency>
</dependencies>
接着配置application.yml
eureka:
instance:
#服务过期时间配置,超过这个时间没有接收到心跳EurekaServer就会将这个实例剔除
#注意,EurekaServer一定要设置eureka.server.eviction-interval-timer-in-ms否则这个配置无效,这个配置一般为服务刷新时间配置的三倍
#默认90s
lease-expiration-duration-in-seconds: 15
#服务刷新时间配置,每隔这个时间会主动心跳一次
#默认30s
lease-renewal-interval-in-seconds: 5
preferIpAddress: true
client:
serviceUrl:
defaultZone: http://localhost:8761/eureka/
ribbon:
#eureka客户端ribbon刷新时间
#默认30s
ServerListRefreshInterval: 1000
feign:
hystrix:
enabled: true
httpclient:
enabled: true
hystrix:
command:
default:
execution:
timeout:
enabled: false
ribbon:
ReadTimeout: 5000
ConnectTimeout: 5000
server:
port: 8765
spring:
application:
name: client
同样是端口,名称,Eureka注册中心地址
在程序的启动类ServiceFeignApplication ,加上@EnableFeignClients注解开启Feign的功能:
@SpringBootApplication
@EnableEurekaClient
@EnableFeignClients
public class ClientApplication {
public static void main(String[] args) {
SpringApplication.run(ClientApplication.class, args);
}
}
然后是创建个controller,和service,需要service利用feign去调用刚才创建的servcieorder服务里的方法,并且需要fallback,这个fallback就是熔断器,一般只返回一个错误信息,里面尽量不要写逻辑方法
controller,注入service
service,写@FeignClient(value = "serviceorder",fallback = OrderHystric.class)注解,value是服务名称,fallback是对应的熔断
Hystric熔断,实现service接口,一般只记录错误
然后启动项目后就能在注册中心看到client了
再浏览器输入http://localhost:8765/order/find,能看到下面的界面
OK。大功告成!