Criar um conjunto de serviços capaz de aceitar requisições RESTful recebendo como parâmetro o nome da cidade ou as coordenadas(lat, long) e retorna como sugestão uma playList de acordo com a temperatura atual.
APIs Externas:
Foram criados os seguintes Serviços:
Cloud-config-server
Eureka-service
Music-service
Weather-service
Sugestion-service
Zull-server
Os passos para obter o projeto em execução são os seguintes:
$ git clone https://github.com/I-am-Miguel/side-b.git sideb_miguel
$ cd sideb_miguel
$ ls
loud-config-server LICENSE Side-b.svg zuul-server
eureka-service music-service sugestion-service
README.md weather-service
$ mkdir git-localconfig-repo && cd git-localconfig-repo
git-localconfig-repo$ touch music-service.properties
git-localconfig-repo$ touch weather-service.properties
Após criado os arquivos .properties
de cada serviço, será necessário adicionar as chaves de acesso de cada api sendo elas:
#music-service.properties
music-service.hostToken=https://accounts.spotify.com/api/token
music-service.hostTrack=https://api.spotify.com/v1/search?q={genre}&type=track
music-service.clientId=<clientID>
music-service.clientSecret=<clientSecret>
#weather-service.properties
weather-service.city=http://api.openweathermap.org/data/2.5/weather?q={city}&appid={key}
weather-service.coordinates=http://api.openweathermap.org/data/2.5/weather?lat={lat}&lon={lng}&appid={key}
weather-service.key=<KEY>
Responsável por centralizar as informações de cada serviço, através dele é gerenciado o SPOTIFY_TOKEN
, WEATHER_KEY
e demais chaves de acessos pessoais que não deveriam ser versionadas.
Execução:
$ cd cloud-config-server
$ gradle build
Aplicação | Porta |
---|---|
Config Server | 8888 |
Responsável pelo Service Registry
, realizando assim o dimensionamento dinâmico.
Execução:
$ cd eureka-service
$ gradle build
Aplicação | Porta |
---|---|
Eureka Service | 8761 |
Responsável por se comunicar com o Spotify retornando uma playList baseada nos gêneros predefinidos.
Execução:
$ cd music-service
$ gradle build
Aplicação | Porta |
---|---|
Music Service | 8100, 8101, ... |
Exemplo de requisição:
CUrl :curl -X GET "http://localhost:8100/genre/pop" -H "accept: application/json"
{
"tracks": {
"href": "https://api.spotify.com/v1/search?query=pop&type=track&offset=0&limit=20",
"items": [
{
"name": "Pop Out (feat. Lil TJay)"
},
{
"name": "POP/STARS"
},
{
"name": "pop a pill"
}
...
]
}
UI: http://localhost:8100/swagger-ui.html
Responsável por se comunicar com o OpenWeatherMaps retornando os dados climáticos do local pesquisado, seja por nome ou coordenadas. obs: Esse serviço representou o maior gargalo da arquitetura, cada requisição a esta API levavam em média 14000ms, por esse motivo foi utilizado o banco Redis para armazenar essa informação em cache
Execução:
$ cd weather-service
$ gradle build
Aplicação | Porta |
---|---|
Weather Service | 8000, 8001, ... |
Exemplo de requisição:
CUrl :curl -X GET "http://localhost:8000/city/santos" -H "accept: application/json"
{
"id": "3449433",
"lat": "-23.96",
"lon": "-46.33",
"dt": "1551883509",
"cod": "200",
"visibility": "10000",
"name": "SANTOS",
"base": "stations",
"weather": [
{
"id": "800",
"icon": "01d",
"description": "clear sky",
"main": "Clear"
}
],
"main": {
"temp": "301.08",
"pressure": "1022",
"humidity": "58",
"temp_min": "300.93",
"temp_max": "301.15"
},
"sys": {
"country": "BR"
},
"coord": {
"lat": "-23.96",
"lon": "-46.33"
},
"tempCelcius": 27.93
}
UI: http://localhost:8000/swagger-ui.html
Agregação dos serviços listados anteriormente, nele foi possível unir as informações de cada serviço, além de atuar como um load balancer e possuir métricas de tolerância a falhas. Execução:
$ cd sugestion-service
$ gradle build
Aplicação | Porta |
---|---|
Sugestion Service | 8200, 8201, ... |
Exemplo de requisição:
CUrl :curl -X GET "http://localhost:8200/sugestion/city/santos" -H "accept: application/json"
{
"message": "It is a little warm out there, what do you think of the playList to cheer up. Temperature: 27.93",
"results": [
"Pop Out (feat. Lil TJay)",
"POP/STARS",
"pop a pill",
"Pop That",
"Pop Style",
"Pop Star",
"Pop Up",
"SexyBack (feat. Timbaland)",
"OutRight",
"Pop Style",
"Love Scars Pt. 2 / Rack City",
"This Is How We Party (with Icona Pop)",
"Pop",
"Is She Gon Pop",
"Blue (Da Ba Dee) - Gabry Ponte Ice Pop Radio",
"Buttercup",
"Pop The Trunk",
"Oh Klahoma",
"Cups (Pitch Perfect’s “When I’m Gone”) - Pop Version",
"Pop Style"
]
}
UI: http://localhost:8200/swagger-ui.html
Ao lidar com vários serviços é necessário garantir que nosso sistema possui tolerância a falhas, caso um serviço fique fora do ar(Serviços sempre falham :P), vejamos o que acontece caso o serviço que se comunica com o spotify fique indisponível:
CUrl :curl -X GET "http://localhost:8200/sugestion/city/santos" -H "accept: application/json"
{
"message": "One of our services is currently unavailable, we are very sorry, please enjoy our playlists",
"results": [
"Só Quero Ver Voce / There Is Only One - Ao Vivo",
"Isaias 9",
"O Dia Que Será Pra Sempre",
"Isaías 9 - Ao Vivo",
"Até Que A Casa Esteja Cheia",
"Pisaduras - Ao Vivo",
"Dia Quente",
"Na Gravidade da Presença",
"No Teu Jardim - Ao Vivo",
"Isaías 9 - Ao Vivo",
"Nível Raso",
"Minha Maior Riqueza",
"Todo Dia Até Morrer",
"Saudades de Casa",
"Tão Sublime - Ao Vivo",
"Mar de Vidro - Ao Vivo",
"Na Gravidade da Presença",
"Avançar (feat. Rodolfo Abrantes)",
"Parecido Contigo",
"Uma Luz Que Não Pode Se Apagar"
]
}
Fronteira de acesso da API, o mesmo funciona como proxy de acesso Bypass
delegando as requisições para o Sugestion-service
$ cd zuul-server
$ gradle build
Aplicação | Porta |
---|---|
Zull Service | 8080 |
byPass localhost:8080 -> localhost:8200/swagger-ui.html
A imagem a seguir ilusta a comunicação entre cada serviço da arquitetura: