springCloud微服务学习总结
SpingCloud微服务学习总结首先springCloud是基于springboot来构建的,应该先了解springboot的特征。eureka用来管理服务register与discovery,构建microService比较简单,只需要@EnableEurekaServer,@EnableEurekaClient两注解。spingCloud的熔断机制Circuit。统一的服务实例监控软件
SpingCloud微服务学习总结
- 首先springCloud是基于springboot来构建的,应该先了解springboot的特征。
- eureka用来管理服务register与discovery,构建microService比较简单,只需要@EnableEurekaServer,@EnableEurekaClient两注解。
- spingCloud的熔断机制Circuit。
- 统一的服务实例监控软件,@EnableHystrixDashboard
- 服务client的负载均衡Ribbon,RestTemplate底层通过Ribbon来实现load balance的访问server。
- Zookeeper在springCloud中集成,通过apache Curator的开源client,Zookeeper能支持服务注册与发现。但我只使用zookeeper的分布式configuration。
7.我的springCloud 代码工程例子:https://git.oschina.net/andrexu2015/mindSpringCloudMicroDemo,欢迎下载。
### 1. spingBoot简单介绍
package com.calm.b;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.EnableAspectJAutoProxy;
import org.springframework.context.annotation.ImportResource;
@Configuration
@ComponentScan("com.calm.*")
@EnableAutoConfiguration(exclude = DataSourceAutoConfiguration.class)
@ImportResource(value = {"applicationContext.xml"})
@EnableAspectJAutoProxy
public class BizApplication {
/**
* 程序的启动入口
*
* @param args
*/
public static void main(String[] args) {
// SpringApplication.run(BizApplication.class, args);
new SpringApplicationBuilder(BizApplication.class).web(true).run(args);
}
}
构建spingboot工程,只需要在所有package目录最根层建立一个main方法class,配上@Configuration,@ComponentScan,@EnableAutoConfiguration注解就能够启动springBoot程序,@SpringBootApplication是前三个注解默认配置的。
1. @Configuration 代表该component是一个spring容器定义的配置bean。
2. @ComponentScan 代表spring容器需要扫表java组件包路径范围。默认是当前class所有在包位置。
3. @EnableAutoConfiguration 启动自动获取配置的开关,exclude是指可以在排除需要的configuration bean。
2. eureka的discovery与register
- @EnableEurekaServer 代表服务管理的服务方,在main class上添加注册,参考例子cloud-eureka-server。
- 它提供管理界面,http://localhost:8761/
- @EnableEurekaClient 客户端则使用这个注解,参考例子cloud-simple-service。
- server与client 的bootstrap.properties配置如下:
#service discovery url
eureka.client.serviceUrl.defaultZone=http://localhost:8761/eureka/
- eureka客户端与服务端之间交互应该知道其原理,EurekaClient 类是其主要组件,可以获取server端的所有注册信息,例子代码:
@RequestMapping(value = "/monitor")
public void getDishSetmealGroup(HttpServletRequest request, HttpServletResponse response)
throws ServletRequestBindingException {
InstanceInfo instanceInfo = discoveryClient.getNextServerFromEureka("cloudSimpleService", false);
System.out.println(instanceInfo.getHealthCheckUrl());
serviceUrl();
}
public String serviceUrl() {
// discoveryClient.geti
List<InstanceInfo> list = discoveryClient.getInstancesById("my-THINK:cloudSimpleService:8082");
if (list != null && list.size() > 0) {
System.out.println(list.get(0).getHomePageUrl());
}
Application application = discoveryClient.getApplication("cloudSimpleService");
list = application.getInstances();
if (list != null && list.size() > 0) {
System.out.println(list.get(0).getHealthCheckUrl());
}
return null;
}
- 通过eureka服务端可以,http://localhost:8761/eureka/apps可以查看一个xml结构式所有注册信息
<instanceId>my-THINK:cloudSimpleService:8082</instanceId>
<hostName>my-THINK</hostName>
<app>CLOUDSIMPLESERVICE</app>
<ipAddr>192.168.7.197</ipAddr>
<status>UP</status>
<overriddenstatus>UNKNOWN</overriddenstatus>
<port enabled="true">8082</port>
<securePort enabled="false">443</securePort>
<countryId>1</countryId>
<dataCenterInfo class="com.netflix.appinfo.InstanceInfo$DefaultDataCenterInfo">
<name>MyOwn</name>
</dataCenterInfo>
7.参考如下http://www.tuicool.com/articles/JBbU3mY ,描述EurekaClient的注册过程。
3. Circuit熔断器例子
参考spring 官方文档
4. HystrixDashboard使用介绍
参考spring 官方文档
5. Ribbon负载均衡的例子
- 我们通过RestTemplate来构建负载均衡,@LoadBalanced 标志
@Configuration
public class BeanConfiguration {
@LoadBalanced
@Bean
// @Order()
public RestTemplate restTemplate(){
return new RestTemplate();
}
}
@Service("usserService")
public class UserService {
@Resource
private RestTemplate restTemplate;
private static final Logger logger = LoggerFactory.getLogger(UserService.class);
final String SERVICE_NAME = "cloudSimpleService";
// @HystrixCommand(fallbackMethod = "fallbackSearchAll")
public List<User> searchAll() {
logger.info("====================================");
List<User> users=null;
try{
users=restTemplate.getForObject("http://" + SERVICE_NAME + "/user", List.class);
}catch(Exception e){
e.printStackTrace();
}
logger.info("====================================");
return users;
}
public List<User> searchAllTwo() {
logger.info("====================================");
List<User> users=null;
try{
users=restTemplate.postForObject("http://" + SERVICE_NAME + "/user",null, List.class);
//restTemplate.exchange(url, method, requestEntity, responseType)
//restTemplate.delete(url);
}catch(Exception e){
e.printStackTrace();
}
logger.info("====================================");
return users;
}
主要通spring.application.name=cloudSimpleService 名字+url来访问具体的服务。
6. zookeeper分布式配置信息集成。
- 这个只介绍zookeeper与springCloud集成的分布式配置。
- 分两种配置基于服务实例之上的全局配置,基于服务的自己配置。
- 基于zookeeper,zkui服务的的配置结构如下:
- 要注意zkui配置文件node结构,
dev –代表自己的环境
– apps:customized – 所有appInstance配置
– cloudSimpleService –测试的服务应用
— —该app自己的属性定义
#App Config Dashboard (ACD) dump created on :Wed Nov 02 15:09:00 CST 2016
/configurations/mind/dev/apps=foo=bar
/configurations/mind/dev/apps:customized=foo=bar
/configurations/mind/dev/apps:customized/customized=age=22222222222
/configurations/mind/dev/apps:customized/customized=foo=bar
/configurations/mind/dev/cloudSimpleService=foo=bar
/configurations/mind/dev/cloudSimpleService/customized=foo=bar
/configurations/mind/dev/cloudSimpleService/customized=password=1wswddewwpassword
/configurations/mind/dev/cloudSimpleService/customized=userName=user12345andrex
/configurations/mind/dev/cloudSimpleService/mysqldb=foo=bar
/configurations/mind/dev/tradeAnalyzer=andrexu2=11
/configurations/mind/dev/tradeAnalyzer=foo=bar
/configurations/mind/dev/tradeAnalyzer=testUserNode=12433
- 服务端的配置如下:
#service name
spring.application.name=cloudSimpleService
spring.profiles.active=dev,datasource,mail,customized
# zookeeper所有集群address
spring.cloud.zookeeper.connectString=testzk1.shishike.com:2181,testzk2.shishike.com:2181,testzk3.shishike.com:2181
#是否开启zookeeper使用
spring.cloud.zookeeper.config.enable=true
#zokkeeper配置的根目录
spring.cloud.zookeeper.config.root=/configurations/mind/dev
spring.cloud.zookeeper.config.defaultContext=apps
spring.cloud.zookeeper.config.profileSeparator=:
- 使用springBoot配置与bean映射功能,测试get属性是否能获取zookeeper配置的值。
@Component
@ConfigurationProperties(prefix="customized")
public class CustomizedProperties {
//@NotNull
private String userName;
//@NotNull
private String password;
private String age;
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
更多推荐
所有评论(0)