springCloud微服务初体验
springboot 与spring Cloud初学者(为了不被比我优秀还比我努力的人落下太远)
先说明,这篇文章很有可能误导别人,请参考《Spring Cloud 微服务实战》
使用的是idea 生成的工程
spring boot 1.5.13(书中是1.3.7)
服务注册中心: spring cloud eureka-server
服务提供:spring cloud eureka-client
服务消费与发现: Ribbon
1. 注册中心:
管理所有向注册中心注册的服务提供。会监测当前服务提供者的信息,是否可用,注册中心的状态
多个注册中心相互注册就形成一个注册中心集群(高可用注册中心),访问某一个注册中必时会看到这个集群中所有的注册中心的信息
看代码:
三个properties配置文件
这个应该不用多说,springboot多环境配置
#application.properties
spring.profiles.active=eureka1
#application-eureka1.properties
server.port =18001
#这个注册中心的名字,会在eureka管理页面中显示,有些时候调用服务也会通过这个名字
spring.application.name=eureka1
#这个注册中心的hostname(例:http://google.com:8080/eureka,hostname就是google.com)
eureka.instance.hostname=eureka1
#向哪个注册中心注册,当一个注册中心启动时,会自动暴露一个注册服务的地址,默认的就是/eureka
eureka.client.service-url.defaultZone=http://eureka2:18002/eureka/
#application-eureka2.properties
server.port =18002
spring.application.name=eureka2
eureka.instance.hostname=eureka2
eureka.client.service-url.defaultZone=http://eureka1:18001/eureka/
启动类
//需要加上这个就可以成为注册中心了
@EnableEurekaServer
@SpringBootApplication
public class BootDemoEurekaServiceApplication {
public static void main(String[] args) {
SpringApplication.run(BootDemoEurekaServiceApplication.class, args);
}
}
因为需要在同一个机器上展示集群,所有需要修改hosts文件,添加:
127.0.0.1 eureka1
127.0.0.1 eureka2
启动程序
java -jar 工程名.jar --spring.profiles.active=eureka1
java -jar 工程名.jar --spring.profiles.active=eureka2
下面需要注意
- 在启动多个注册中心集群时这几个属性不能设置一样
spring.application.name,eureka.instance.hostname=eureka1,如果设置成一样的就说明在同一个服务器上运行,就不会被当成集群管理页面上的DS Replicas不会显示
,分片功能不会有用,只会被认为是普通注册的两个应用 - 使用Idea如下设置会省不少事
只需要修改一下 program arguments,idea 会启用一个 Run Dashboard的窗口
下面是访问 http://eureka1:18001 的页面
2. 服务提供者
三个properties配置文件
#application.properties
#向服务中心注册的服务名 如果同一个服务启动在两个端口上,name应该一样,否则在Ribbon通过名字调用时就不能达到负载均衡的效果了
spring.profiles.active=demo1
spring.application.name=demospring.profiles.active=demo1
#向服务中心注册的服务名 如果同一个服务启动在两个端口上,name应该一样,否则在Ribbon通过名字调用时就不能达到负载均衡的效果了
spring.application.name=demo
#application-demo1.properties
server.port=19001
#去掉actuator的权限控制
management.security.enabled=false
eureka.client.service-url.defaultZone=http://eureka1:18001/eureka/,http://eureka2:18002/eureka/
#application-demo2.properties
server.port=19002
#去掉actuator的权限控制
management.security.enabled=false
eureka.client.service-url.defaultZone=http://eureka1:18001/eureka/,http://eureka2:18002/eureka/
启动类
//需要加@EnableEurekaClient
@SpringBootApplication
@EnableEurekaClient
public class BootDemoApplication {
public static void main(String[] args) {
SpringApplication.run(BootDemoApplication.class, args);
}
}
随便写一个接口
private final Logger logger = LoggerFactory.getLogger(this.getClass());
@Autowired
private Registration client;
@RequestMapping("/hello")
public String test() {
logger.info(client.getHost());
logger.info(client.getPort() + "");
logger.info(client.getUri().toString());
//返回当前访问的主机名与接口
return "host: " + client.getHost() + "; \n port :" + client.getPort();
}
用刚才启动eureka的方法启动这个服务两次,注意接口不能一样
这时候在管理界面上就会看到
DEMO n/a (2) (2)
这一列,这就是同一个服务启动了两个,下面在使用消费者的时候消费者会通过DEMO来找到服务,通过一定的算法决定具体请求哪个端口上的服务
服务消费者
#application.properties
spring.application.name=ribbon-demo
server.port=17001
#也需要注册到注册中心,因为他本身也是一个web服务的提供者,
#只不过他提供一些特殊的功能,他是基于HTTP或TCP协议向其他程序发请求来实现消费功能的
#(我也不知道这么说是否准确),就是访问ribbon服务,由他来决定具体访问哪个端口上的程序
eureka.client.service-url.defaultZone=http://eureka1:18001/eureka/,http://eureka2:18002/eureka/
启动类
@SpringBootApplication
@EnableEurekaClient
public class BootRibbonDemoApplication {
public static void main(String[] args) {
SpringApplication.run(BootRibbonDemoApplication.class, args);
}
@Bean
@LoadBalanced
RestTemplate restTemplate() {
//向消费者程序中注入一个对象,这个对象可以完成程序之间的通信
return new RestTemplate();
}
}
真正对外的接口
@RestController
public class RibbonController {
private final Logger logger = LoggerFactory.getLogger(this.getClass());
@Autowired
RestTemplate restTemplate;
@RequestMapping("/hello")
public String hello(){
//下面这行就是向其他程序发请求,一相当于浏览器向DEMO服务发请求,
return restTemplate.getForEntity("http://DEMO/hello",String.class).getBody();
}
@RequestMapping("/hi")
public String hi(){
//他也可以是一个普通的接口
return "/hi";
}
}
启动消费者程序
访问 /hello,多刷新几次会看到端口号一直变化
问题会比较多,希望多指点