springCloud微服务初体验

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. 注册中心:

管理所有向注册中心注册的服务提供。会监测当前服务提供者的信息,是否可用,注册中心的状态
多个注册中心相互注册就形成一个注册中心集群(高可用注册中心),访问某一个注册中必时会看到这个集群中所有的注册中心的信息


springCloud微服务初体验_第1张图片
cloud.png

看代码:

三个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

下面需要注意

  1. 在启动多个注册中心集群时这几个属性不能设置一样
    spring.application.name,eureka.instance.hostname=eureka1,如果设置成一样的就说明在同一个服务器上运行,就不会被当成集群管理页面上的DS Replicas不会显示,分片功能不会有用,只会被认为是普通注册的两个应用
  2. 使用Idea如下设置会省不少事
springCloud微服务初体验_第2张图片
eureka.png

只需要修改一下 program arguments,idea 会启用一个 Run Dashboard的窗口

下面是访问 http://eureka1:18001 的页面

springCloud微服务初体验_第3张图片
eureak2.png

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,多刷新几次会看到端口号一直变化

问题会比较多,希望多指点

你可能感兴趣的:(springCloud微服务初体验)